Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion serverless-fleets/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ Run a serverless fleet that runs 1 single task and instance with 2 CPUs and 4 GB
ibmcloud code-engine fleet create
--name fleet-b4bd2a33-1
--tasks-state-store fleet-task-store
--subnetpool-name fleet-subnetpool
--image registry.access.redhat.com/ubi8/ubi-minimal:latest
--command=sleep
--arg 60
Expand All @@ -152,6 +153,7 @@ ibmcloud code-engine fleet create
Successfully created fleet with name 'fleet-b4bd2a33-1' and ID 'e3caac88-cfc2-4602-8684-b527a6811716'
Run 'ibmcloud ce fleet get --id e3caac88-cfc2-4602-8684-b527a6811716' to check the fleet status.
Run 'ibmcloud ce fleet worker list --fleet-id e3caac88-cfc2-4602-8684-b527a6811716' to retrieve a list of provisioned workers.
Run 'ibmcloud ce fleet task list --fleet-id e3caac88-cfc2-4602-8684-b527a6811716' to retrieve a list of tasks.
OK
```
</details>
Expand Down Expand Up @@ -283,8 +285,9 @@ Run a serverless fleet to process 100 tasks where each tasks gets 1 CPU and 2 GB
```
➜ serverless-fleets ibmcloud code-engine fleet create
--name fleet-847292b7-1
--image registry.access.redhat.com/ubi8/ubi-minimal:latest
--tasks-state-store fleet-task-store
--subnetpool-name fleet-subnetpool
--image registry.access.redhat.com/ubi8/ubi-minimal:latest
--command=sleep
--arg 2
--tasks 100
Expand Down
60 changes: 42 additions & 18 deletions serverless-fleets/init-fleet-sandbox
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,19 @@ function clean() {
ibmcloud is public-gateway-delete $vpc_name-gateway --force 2>/dev/null
# END Remove old legacy components

ibmcloud is subnet-delete $vpc_name-subnet-1 --force 2>/dev/null
ibmcloud is subnet-delete $vpc_name-subnet-2 --force 2>/dev/null
ibmcloud is subnet-delete $vpc_name-subnet-3 --force 2>/dev/null
for i in {1..3}
do
if ibmcloud is subnet-public-gateway $vpc_name-subnet-$i >/dev/null 2>&1; then
ibmcloud is subnet-public-gateway-detach $vpc_name-subnet-$i --force 2>/dev/null
fi
if ibmcloud is subnet $vpc_name-subnet-$i $vpc_name >/dev/null 2>&1; then
ibmcloud is subnet-delete $vpc_name-subnet-$i --force 2>/dev/null
fi
if ibmcloud is public-gateway $vpc_name-gateway-$i >/dev/null 2>&1; then
ibmcloud is public-gateway-delete $vpc_name-gateway-$i --force 2>/dev/null
fi
done

ibmcloud is network-acl-delete $vpc_name-acl --force 2>/dev/null
ibmcloud is security-group-delete $vpc_name-group --force 2>/dev/null
ibmcloud is vpc-delete $vpc_name --force 2>/dev/null
Expand Down Expand Up @@ -332,7 +342,7 @@ fi
# Create the Network ACL
if ! ibmcloud is network-acl $vpc_name-acl $vpc_name >/dev/null 2>&1; then
print_msg "\nCreating the VPC Network ACL '$vpc_name-acl' ..."
ibmcloud is network-acl-create $vpc_name-acl $vpc_name --rules '[{ "name": "egress", "action": "allow", "destination": "0.0.0.0/0", "direction": "outbound", "source": "0.0.0.0/0", "protocol": "all" }, { "name": "ingress", "action": "allow", "destination": "0.0.0.0/0", "direction": "inbound", "source": "0.0.0.0/0", "protocol": "all" }]'
ibmcloud is network-acl-create $vpc_name-acl $vpc_name --rules '[{ "name": "egress", "action": "allow", "destination": "0.0.0.0/0", "direction": "outbound", "source": "0.0.0.0/0", "protocol": "icmp_tcp_udp" }, { "name": "ingress", "action": "allow", "destination": "0.0.0.0/0", "direction": "inbound", "source": "0.0.0.0/0", "protocol": "icmp_tcp_udp" }]'
if [ $? -ne 0 ]; then
print_error "VPC Network ACL creation failed!"
abortScript
Expand Down Expand Up @@ -409,11 +419,11 @@ if ! ibmcloud is security-group $vpc_name-group $vpc_name >/dev/null 2>&1; then
fi

print_msg "\nCreating required VPC Security group rules ..."
ibmcloud is security-group-rule-add $vpc_name-group outbound all --remote 0.0.0.0/0 --vpc $vpc_name >/dev/null
ibmcloud is security-group-rule-add $vpc_name-group outbound all --remote 161.26.0.0/16 --vpc $vpc_name >/dev/null
ibmcloud is security-group-rule-add $vpc_name-group outbound all --remote 166.8.0.0/14 --vpc $vpc_name >/dev/null
ibmcloud is security-group-rule-add $vpc_name-group outbound all --remote $vpc_name-group --vpc $vpc_name >/dev/null
ibmcloud is security-group-rule-add $vpc_name-group inbound all --remote $vpc_name-group --vpc $vpc_name >/dev/null
ibmcloud is security-group-rule-add $vpc_name-group outbound icmp_tcp_udp --remote 0.0.0.0/0 --vpc $vpc_name >/dev/null
ibmcloud is security-group-rule-add $vpc_name-group outbound icmp_tcp_udp --remote 161.26.0.0/16 --vpc $vpc_name >/dev/null
ibmcloud is security-group-rule-add $vpc_name-group outbound icmp_tcp_udp --remote 166.8.0.0/14 --vpc $vpc_name >/dev/null
ibmcloud is security-group-rule-add $vpc_name-group outbound icmp_tcp_udp --remote $vpc_name-group --vpc $vpc_name >/dev/null
ibmcloud is security-group-rule-add $vpc_name-group inbound icmp_tcp_udp --remote $vpc_name-group --vpc $vpc_name >/dev/null
echo "Done"

print_msg "\nPrinting the VPC Security group '$vpc_name-group' ..."
Expand Down Expand Up @@ -624,23 +634,37 @@ if ! ibmcloud ce pds get --name fleet-input-store >/dev/null 2>&1; then
--cos-access-secret fleet-cos-secret
fi


print_msg "\nCreating the Code Engine subnetpools 'fleet-subnetpool' ..."
if ! ibmcloud ce connectivity subnetpool get --name fleet-subnetpool >/dev/null 2>&1; then
security_group_crn="$(ibmcloud is security-group ${vpc_name}-group --output json | jq -r '.crn')"
ibmcloud ce connectivity subnetpool create --name fleet-subnetpool \
--subnet-crn key_1="$(ibmcloud is subnet ${vpc_name}-subnet-1 --output json | jq -r '.crn')" \
--security-group-crn key_1="${security_group_crn}" \
--subnet-crn key_2="$(ibmcloud is subnet ${vpc_name}-subnet-2 --output json | jq -r '.crn')" \
--security-group-crn key_2="${security_group_crn}" \
--subnet-crn key_3="$(ibmcloud is subnet ${vpc_name}-subnet-3 --output json | jq -r '.crn')" \
--security-group-crn key_3="${security_group_crn}"
fi
for i in {1..3}
do
if ! ibmcloud ce connectivity subnetpool get --name fleet-subnetpool-zone-$i >/dev/null 2>&1; then
security_group_crn="$(ibmcloud is security-group ${vpc_name}-group --output json | jq -r '.crn')"
ibmcloud ce connectivity subnetpool create --name fleet-subnetpool-zone-$i \
--subnet-crn key="$(ibmcloud is subnet ${vpc_name}-subnet-$i --output json | jq -r '.crn')" \
--security-group-crn key="${security_group_crn}"
fi
done

print_msg "\nCreating the Code Engine default secret 'codeengine-fleet-defaults' with observability and VPC subnet configurations ..."
create_or_update=update
if ! ibmcloud ce secret get --name codeengine-fleet-defaults >/dev/null 2>&1; then
create_or_update=create
fi
security_group_crn="$(ibmcloud is security-group ${vpc_name}-group --output json | jq -r '.crn')"
ibmcloud ce secret $create_or_update -n codeengine-fleet-defaults \
--from-literal pool_subnet_crn_1="$(ibmcloud is subnet ${vpc_name}-subnet-1 --output json | jq -r '.crn')" \
--from-literal pool_security_group_crns_1="${security_group_crn}" \
--from-literal pool_subnet_crn_2="$(ibmcloud is subnet ${vpc_name}-subnet-2 --output json | jq -r '.crn')" \
--from-literal pool_security_group_crns_2="${security_group_crn}" \
--from-literal pool_subnet_crn_3="$(ibmcloud is subnet ${vpc_name}-subnet-3 --output json | jq -r '.crn')" \
--from-literal pool_security_group_crns_3="${security_group_crn}"

if [[ "$SETUP_LOGGING" == "true" && "$icl_ingestion_apikey" != "" ]]; then
print_msg "\nMake sure logs are sent to '${icl_ingestion_host}' ..."
ibmcloud ce secret update -n codeengine-fleet-defaults \
ibmcloud ce secret $create_or_update -n codeengine-fleet-defaults \
--from-literal logging_ingress_endpoint="${icl_ingestion_host}" \
--from-literal logging_sender_api_key="${icl_ingestion_apikey}" \
--from-literal logging_level_agent=info \
Expand Down
3 changes: 2 additions & 1 deletion serverless-fleets/run
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ uuid=$(uuidgen | tr '[:upper:]' '[:lower:]' | awk -F- '{print $1}')
echo ibmcloud code-engine fleet create
echo " " --name "fleet-${uuid}-1"
echo " " --tasks-state-store fleet-task-store
echo " " --subnetpool-name fleet-subnetpool
echo " " --image registry.access.redhat.com/ubi9/ubi-minimal:latest
echo " " --command="sleep"
echo " " --arg "60"
Expand All @@ -15,4 +16,4 @@ echo " " --cpu 2
echo " " --memory 4G
echo " " --max-scale 1

ibmcloud code-engine fleet create --name "fleet-${uuid}-1" --tasks-state-store fleet-task-store --image registry.access.redhat.com/ubi9/ubi-minimal:latest --max-scale 1 --command="sleep" --arg "60" --tasks 1 --cpu 2 --memory 4G
ibmcloud code-engine fleet create --name "fleet-${uuid}-1" --tasks-state-store fleet-task-store --subnetpool-name fleet-subnetpool --image registry.access.redhat.com/ubi9/ubi-minimal:latest --max-scale 1 --command="sleep" --arg "60" --tasks 1 --cpu 2 --memory 4G
3 changes: 2 additions & 1 deletion serverless-fleets/run_gpu
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,12 @@ uuid=$(uuidgen | tr '[:upper:]' '[:lower:]' | awk -F- '{print $1}')
echo ibmcloud code-engine fleet create
echo " " --name "fleet-${uuid}-1"
echo " " --tasks-state-store fleet-task-store
echo " " --subnetpool-name fleet-subnetpool
echo " " --image registry.access.redhat.com/ubi8/ubi-minimal:latest
echo " " --command="sleep"
echo " " --arg "60"
echo " " --tasks 1
echo " " --max-scale 1
echo " " --gpu l40s:1

ibmcloud code-engine fleet create --name "fleet-${uuid}-1" --tasks-state-store fleet-task-store --image registry.access.redhat.com/ubi8/ubi-minimal:latest --max-scale 1 --command="sleep" --arg "60" --tasks 1 --gpu l40s:1
ibmcloud code-engine fleet create --name "fleet-${uuid}-1" --tasks-state-store fleet-task-store --subnetpool-name fleet-subnetpool --image registry.access.redhat.com/ubi8/ubi-minimal:latest --max-scale 1 --command="sleep" --arg "60" --tasks 1 --gpu l40s:1
21 changes: 11 additions & 10 deletions serverless-fleets/run_parallel_tasks
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,15 @@ CPU=1
MEMORY=2G

echo ibmcloud code-engine fleet create
echo " "--name "fleet-${uuid}-1"
echo " "--image registry.access.redhat.com/ubi8/ubi-minimal:latest
echo " "--tasks-state-store fleet-task-store
echo " "--command="sleep"
echo " "--arg "2"
echo " "--tasks $TASKS
echo " "--cpu $CPU
echo " "--memory $MEMORY
echo " "--max-scale $MAX_SCALE
echo " " --name "fleet-${uuid}-1"
echo " " --tasks-state-store fleet-task-store
echo " " --subnetpool-name fleet-subnetpool
echo " " --image registry.access.redhat.com/ubi8/ubi-minimal:latest
echo " " --command="sleep"
echo " " --arg "2"
echo " " --tasks $TASKS
echo " " --cpu $CPU
echo " " --memory $MEMORY
echo " " --max-scale $MAX_SCALE

ibmcloud code-engine fleet create --name "fleet-${uuid}-1" --tasks-state-store fleet-task-store --image registry.access.redhat.com/ubi9/ubi-minimal:latest --max-scale ${MAX_SCALE} --command="sleep" --arg "2" --tasks ${TASKS} --cpu ${CPU} --memory ${MEMORY}
ibmcloud code-engine fleet create --name "fleet-${uuid}-1" --tasks-state-store fleet-task-store --subnetpool-name fleet-subnetpool --image registry.access.redhat.com/ubi9/ubi-minimal:latest --max-scale ${MAX_SCALE} --command="sleep" --arg "2" --tasks ${TASKS} --cpu ${CPU} --memory ${MEMORY}
22 changes: 12 additions & 10 deletions serverless-fleets/run_wordcount
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,17 @@ CMDS=wordcount_commands.jsonl
# ls data/tutorials/wordcount | awk '{ printf " { \"command\":\"/bin/bash\", \"args\": [\"-c\", \"cd /mnt/ce/data; wc tutorials/wordcount/"$1" > result/wordcount_"$1"\"]}\n" }' > wordcount_commands.jsonl

echo ibmcloud code-engine fleet run
echo " "--name "fleet-${uuid}-1"
echo " "--image registry.access.redhat.com/ubi9/ubi-minimal:latest
echo " "--tasks-from-local-file $CMDS
echo " "--cpu $CPU
echo " "--memory $MEMORY
echo " "--max-scale $MAX_SCALE
echo " "--mount-data-store /input=fleet-input-store:/wordcount
echo " "--mount-data-store /output=fleet-output-store:/wordcount

ibmcloud code-engine fleet create --name "fleet-${uuid}-1" --tasks-state-store fleet-task-store --image registry.access.redhat.com/ubi9/ubi-minimal:latest --max-scale $MAX_SCALE --tasks-from-local-file $CMDS --cpu $CPU --memory $MEMORY --mount-data-store /input=fleet-input-store:/wordcount --mount-data-store /output=fleet-output-store:/wordcount
echo " " --name "fleet-${uuid}-1"
echo " " --tasks-state-store fleet-task-store
echo " " --subnetpool-name fleet-subnetpool
echo " " --image registry.access.redhat.com/ubi9/ubi-minimal:latest
echo " " --tasks-from-local-file $CMDS
echo " " --cpu $CPU
echo " " --memory $MEMORY
echo " " --max-scale $MAX_SCALE
echo " " --mount-data-store /input=fleet-input-store:/wordcount
echo " " --mount-data-store /output=fleet-output-store:/wordcount

ibmcloud code-engine fleet create --name "fleet-${uuid}-1" --tasks-state-store fleet-task-store --subnetpool-name fleet-subnetpool --image registry.access.redhat.com/ubi9/ubi-minimal:latest --max-scale $MAX_SCALE --tasks-from-local-file $CMDS --cpu $CPU --memory $MEMORY --mount-data-store /input=fleet-input-store:/wordcount --mount-data-store /output=fleet-output-store:/wordcount


5 changes: 5 additions & 0 deletions serverless-fleets/tutorials/docling/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ Launch the fleet with the following command in the `tutorials/docling` directory
```
➜ docling ./run
ibmcloud code-engine fleet create --name fleet-3128b1c7-1
--tasks-state-store fleet-task-store
--subnetpool-name fleet-subnetpool
--image quay.io/docling-project/docling-serve-cpu
--registry-secret fleet-registry-secret
--worker-profile mx3d-24x240
Expand All @@ -88,6 +90,7 @@ ibmcloud code-engine fleet create --name fleet-3128b1c7-1
Successfully created fleet with name 'fleet-3128b1c7-1' and ID 'bd00d46e-4645-43b0-a892-d153455ac576'
Run 'ibmcloud ce fleet get --id bd00d46e-4645-43b0-a892-d153455ac576' to check the fleet status.
Run 'ibmcloud ce fleet worker list --fleet-id bd00d46e-4645-43b0-a892-d153455ac576' to retrieve a list of provisioned workers.
Run 'ibmcloud ce fleet task list --fleet-id bd00d46e-4645-43b0-a892-d153455ac576' to retrieve a list of tasks.
OK
```
</details>
Expand Down Expand Up @@ -240,6 +243,8 @@ The GPUs are defined by setting the family and the number of GPUs per task, e.g.
```
./run_gpu
ibmcloud code-engine fleet create --name fleet-cc1f880d-1
--tasks-state-store fleet-task-store
--subnetpool-name fleet-subnetpool
--image quay.io/docling-project/docling-serve
--registry-secret fleet-registry-secret
--max-scale 1
Expand Down
21 changes: 12 additions & 9 deletions serverless-fleets/tutorials/docling/run
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,25 @@ uuid=$(uuidgen | tr '[:upper:]' '[:lower:]' | awk -F- '{print $1}')
IMAGE="quay.io/docling-project/docling-serve-cpu"

echo ibmcloud code-engine fleet create --name "fleet-${uuid}-1"
echo " "--image $IMAGE
echo " "--worker-profile mx3d-24x240
echo " "--max-scale 8
echo " "--tasks-from-local-file commands.jsonl
echo " "--cpu 12
echo " "--memory 120G
echo " "--mount-data-store /input=fleet-input-store:/docling
echo " "--mount-data-store /output=fleet-output-store:/docling
echo " " --tasks-state-store fleet-task-store
echo " " --subnetpool-name fleet-subnetpool
echo " " --image $IMAGE
echo " " --worker-profile mx3d-24x240
echo " " --max-scale 8
echo " " --tasks-from-local-file commands.jsonl
echo " " --cpu 12
echo " " --memory 120G
echo " " --mount-data-store /input=fleet-input-store:/docling
echo " " --mount-data-store /output=fleet-output-store:/docling

ibmcloud code-engine fleet create --name "fleet-${uuid}-1" \
--tasks-state-store fleet-task-store \
--subnetpool-name fleet-subnetpool \
--image $IMAGE \
--worker-profile mx3d-24x240 \
--max-scale 8 \
--tasks-from-local-file commands.jsonl \
--cpu 12 \
--memory 120G \
--tasks-state-store fleet-task-store \
--mount-data-store /input=fleet-input-store:/docling \
--mount-data-store /output=fleet-output-store:/docling
17 changes: 10 additions & 7 deletions serverless-fleets/tutorials/docling/run_gpu
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,21 @@ uuid=$(uuidgen | tr '[:upper:]' '[:lower:]' | awk -F- '{print $1}')
IMAGE="quay.io/docling-project/docling-serve"

echo ibmcloud code-engine fleet create --name "fleet-${uuid}-1"
echo " "--image $IMAGE
echo " "--max-scale 1
echo " "--tasks-from-local-file commands.jsonl
echo " "--gpu l40s
echo " "--mount-data-store /input=fleet-input-store:/docling
echo " "--mount-data-store /output=fleet-output-store:/docling
echo " " --tasks-state-store fleet-task-store
echo " " --subnetpool-name fleet-subnetpool
echo " " --image $IMAGE
echo " " --max-scale 1
echo " " --tasks-from-local-file commands.jsonl
echo " " --gpu l40s
echo " " --mount-data-store /input=fleet-input-store:/docling
echo " " --mount-data-store /output=fleet-output-store:/docling

ibmcloud code-engine fleet create --name "fleet-${uuid}-1" \
--tasks-state-store fleet-task-store \
--subnetpool-name fleet-subnetpool \
--image $IMAGE \
--max-scale 1 \
--tasks-from-local-file commands.jsonl \
--gpu l40s \
--tasks-state-store fleet-task-store \
--mount-data-store /input=fleet-input-store:/docling \
--mount-data-store /output=fleet-output-store:/docling
3 changes: 2 additions & 1 deletion serverless-fleets/tutorials/inferencing/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -176,11 +176,12 @@ Use `./run_h100` to run all 8 batches from `commands_h100.jsonl` on machine with
```
➜ inferencing ./run
ibmcloud code-engine fleet create --name fleet-19f82e90-1
--tasks-state-store fleet-task-store \
--subnetpool-name fleet-subnetpool \
--image private.de.icr.io/ce--fleet-inferencing-e7469696/inferencing
--registry-secret ce-auto-icr-private-eu-de
--max-scale 1
--tasks-from-local-file commands.jsonl
--tasks-state-store fleet-task-store
--gpu l40s:1
--cpu 24
--memory 120G
Expand Down
32 changes: 17 additions & 15 deletions serverless-fleets/tutorials/inferencing/run
Original file line number Diff line number Diff line change
Expand Up @@ -18,30 +18,32 @@ REGISTRY_SECRET_NAME="ce-auto-icr-private-$REGION"
PRIVATE_IMAGE="private.$IMAGE"

echo ibmcloud code-engine fleet create --name "fleet-${uuid}-1"
echo " "--image $PRIVATE_IMAGE
echo " "--registry-secret $REGISTRY_SECRET_NAME
echo " "--max-scale 1
echo " "--tasks-from-local-file commands.jsonl
echo " "--tasks-state-store fleet-task-store
echo " "--gpu l40s:1
echo " "--cpu 24
echo " "--memory 120G
echo " "--env HUGGINGFACEHUB_API_TOKEN="REDACTED"
echo " "--env PYTORCH_CUDA_ALLOC_CONF="expandable_segments:True"
echo " "--env MODEL_NAME="ibm-granite/granite-4.0-micro"
echo " "--mount-data-store /root/.cache/huggingface=fleet-input-store:/huggingface
echo " "--mount-data-store /input=fleet-input-store:/inferencing
echo " "--mount-data-store /output=fleet-output-store:/inferencing
echo " " --tasks-state-store fleet-task-store
echo " " --subnetpool-name fleet-subnetpool
echo " " --image $PRIVATE_IMAGE
echo " " --registry-secret $REGISTRY_SECRET_NAME
echo " " --max-scale 1
echo " " --tasks-from-local-file commands.jsonl
echo " " --gpu l40s:1
echo " " --cpu 24
echo " " --memory 120G
echo " " --env HUGGINGFACEHUB_API_TOKEN="REDACTED"
echo " " --env PYTORCH_CUDA_ALLOC_CONF="expandable_segments:True"
echo " " --env MODEL_NAME="ibm-granite/granite-4.0-micro"
echo " " --mount-data-store /root/.cache/huggingface=fleet-input-store:/huggingface
echo " " --mount-data-store /input=fleet-input-store:/inferencing
echo " " --mount-data-store /output=fleet-output-store:/inferencing

ibmcloud code-engine fleet create --name "fleet-${uuid}-1" \
--tasks-state-store fleet-task-store \
--subnetpool-name fleet-subnetpool \
--image $PRIVATE_IMAGE \
--registry-secret $REGISTRY_SECRET_NAME \
--max-scale 1 \
--tasks-from-local-file commands.jsonl \
--gpu l40s:1 \
--cpu 24 \
--memory 120G \
--tasks-state-store fleet-task-store \
--env HUGGINGFACEHUB_API_TOKEN="$HUGGINGFACEHUB_API_TOKEN" \
--env PYTORCH_CUDA_ALLOC_CONF="expandable_segments:True" \
--env MODEL_NAME="ibm-granite/granite-4.0-micro" \
Expand Down
Loading