From 233a3f43139929e8d66985f939c800782e822298 Mon Sep 17 00:00:00 2001 From: Wenxin Zhang Date: Thu, 4 Jan 2024 17:01:18 +0800 Subject: [PATCH] add cpp graph model test Signed-off-by: Wenxin Zhang --- .../scripts/models/calculate_percentage.py | 88 ---- tests/model-test/calculate_percentiles.py | 0 tests/model-test/cpp_graph_inference.sh | 440 ++++++++++++++++++ tests/model-test/cpp_graph_prompts.json | 57 +++ 4 files changed, 497 insertions(+), 88 deletions(-) delete mode 100644 .github/workflows/scripts/models/calculate_percentage.py create mode 100644 tests/model-test/calculate_percentiles.py create mode 100644 tests/model-test/cpp_graph_inference.sh create mode 100644 tests/model-test/cpp_graph_prompts.json diff --git a/.github/workflows/scripts/models/calculate_percentage.py b/.github/workflows/scripts/models/calculate_percentage.py deleted file mode 100644 index b79c6c6df..000000000 --- a/.github/workflows/scripts/models/calculate_percentage.py +++ /dev/null @@ -1,88 +0,0 @@ -import numpy as np -import re -import sys -import os -def calculate_percentile(data, percentile): - return np.percentile(data, percentile, method="closest_observation") - -def calculate_mean(data): - return np.mean(data) - -def parse_output_file(file_path): - predictions = [] - with open(file_path, 'r', encoding='UTF-8', errors='ignore') as file: - for line in file: - match = re.search(r"time: (\d+\.\d+)ms", line) - if match: - prediction_time = float(match.group(1)) # Assuming the prediction time is in the second column - predictions.append(prediction_time) - return predictions -def parse_memory_file(memory_file): - memory_values = [] - if os.path.exists(memory_file): - with open(memory_file, 'r') as file: - for line in file: - match = re.search(r"Private \s+\d+\.\d+\s+ \d+\.\d+\s+ (\d+\.\d+)", line) - if match: - memory_value = float(match.group(1)) - memory_values.append(memory_value) - else: - print("memory_file is not exist") - memory_values.append(0.0) - return memory_values - - -if __name__ == "__main__": - if len(sys.argv) < 8: - print("Usage: python executor.py output_file") - sys.exit(1) - - output_file = sys.argv[1] - model = sys.argv[2] - precision = sys.argv[3] - cores_per_instance = sys.argv[4] - batch_size = sys.argv[5] - model_input = sys.argv[6] - model_output = sys.argv[7] - memory_file = os.environ.get("WORKING_DIR") + "/memory.txt" - predictions = parse_output_file(output_file) - first_token_latency = predictions[0] - p90 = calculate_percentile(predictions, 90) - p99 = calculate_percentile(predictions, 99) - latency_mean = calculate_mean(predictions[1:]) - total_latency = np.sum(predictions) - - print("P90: {:.2f} ms".format(p90)) - print("P99: {:.2f} ms".format(p99)) - print("average_latency: {:.2f} ms".format(latency_mean)) - print("first_token_latency: {:.2f} ms".format(first_token_latency)) - - memory_values = parse_memory_file(memory_file) - sorted_memory_values = sorted(memory_values, reverse=True) - top_50_percent = sorted_memory_values[:int(len(sorted_memory_values) * 0.5)] - memory_mean = calculate_mean(top_50_percent) - - print("Memory Mean (Top 50%): {:.2f}".format(memory_mean)) - log_file = os.environ.get("WORKING_DIR") + "/cpp_graph_summary.log" - link = os.environ.get("WORKING_DIR") + os.path.basename(output_file) - with open (log_file, 'a') as f: - f.write("engine,") - f.write("latency,") - f.write(model + ",") - f.write(precision + ",") - f.write(batch_size + ",") - f.write(model_input + ",") - f.write(model_output + ",") - f.write(cores_per_instance + ",,") - f.write("{:.2f},".format(first_token_latency)) - f.write("{:.2f},".format(latency_mean)) - f.write("{:.2f},".format(total_latency)) - f.write("{:.2f},".format(memory_mean)) - f.write(link + ",") - f.write("{:.2f},".format(p90)) - f.write("{:.2f},".format(p99)) - #f.write(",latency:") - #for latency in predictions: - # f.write(",{:.2f}".format(latency)) - f.write("\n") - f.close() diff --git a/tests/model-test/calculate_percentiles.py b/tests/model-test/calculate_percentiles.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/model-test/cpp_graph_inference.sh b/tests/model-test/cpp_graph_inference.sh new file mode 100644 index 000000000..a6527a299 --- /dev/null +++ b/tests/model-test/cpp_graph_inference.sh @@ -0,0 +1,440 @@ +#!/bin/bash +#=============================================================================== +# Copyright (c) 2023 Intel Corporation +# +# 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. +#=============================================================================== + +script_dir=$(dirname "${BASH_SOURCE[0]}") +set -x +quant_nthr=48 +cores_list=(32 48 56) +#cores_list=(48) +batch_size_list=(1) +#input_list=(10 32 1024 2012) +input_list=(32 1024 2012) +output_list=(32) +beam_list=(1) +# input_list=(32 512) +# output_list=(32 128 512) +extra_precision_list=("q4_j_i8_g128" "q4_j_i8_g32" "q4_0") # precisions to be tested for most of supported models + +ppl_dataset_list=("/tf_dataset2/datasets/nlp_toolkit/wikitext-2-raw-v1-data-test") +ppl_nctx_list=() # no ppl test by defalut +# ppl_nctx_list=(256 1024 2048) +drop_caches=false +ppl_fp32_test=false +ppl_mf16_test=false +local_models="" + +# parse named arguments +while [ $# -gt 0 ]; do + case "$1" in + --local_models=*) + # A json file which map HF model name to local path + local_models="${1#*=}" + ;; + --cores_list=*) + IFS=', ' read -r -a cores_list <<<"${1#*=}" + ;; + --batch_size_list=*) + IFS=', ' read -r -a batch_size_list <<<"${1#*=}" + ;; + --input_list=*) + # list of input length + IFS=', ' read -r -a input_list <<<"${1#*=}" + ;; + --output_list=*) + IFS=', ' read -r -a output_list <<<"${1#*=}" + ;; + --beam_list=*) + IFS=', ' read -r -a beam_list <<<"${1#*=}" + ;; + --ppl_dataset_list=*) + IFS=', ' read -r -a ppl_dataset_list <<<"${1#*=}" + ;; + --extra_precision_list=*) + # tested precisions = unique(extra_precision_list + model-specific precision) + IFS=', ' read -r -a extra_precision_list <<<"${1#*=}" + ;; + --drop_caches) + # be careful to turn this on; it requires sudo + drop_caches=true + ;; + --ppl_nctx_list=*) + # set to non-empty to enable ppl test + IFS=', ' read -r -a ppl_nctx_list <<<"${1#*=}" + ;; + --ppl_fp32_test) + ppl_fp32_test=true + ;; + --ppl_mf16_test) + # be careful to turn this on; it will double the workload + ppl_mf16_test=true + ;; + --) + shift + break + ;; + *) + break + ;; + esac + shift +done + +declare -p cores_list +declare -p batch_size_list +declare -p input_list +declare -p output_list +declare -p beam_list +declare -p extra_precision_list + +declare -p ppl_dataset_list +declare -p ppl_nctx_list +declare -p ppl_fp32_test +declare -p ppl_mf16_test + +function ppl_eval() { + local task_name="$1" + local n_cores="$2" + local model_path="$3" + local quantized_weight_path="$4" + local memory_dtype_list=('auto') + if [[ "$ppl_mf16_test" = true ]]; then + memory_dtype_list+=('f16') + fi + + echo "======= PPL Evaluation Start =======" + for memory_dtype in ${memory_dtype_list[@]}; do + for ppl_dataset in ${ppl_dataset_list[@]}; do + for ppl_nctx in ${ppl_nctx_list[@]}; do + local ppl_task_name="$task_name-ppl-$(basename -- "$ppl_dataset")-nctx$ppl_nctx-M$memory_dtype" + echo "***** PPL: $ppl_task_name *****" + OMP_NUM_THREADS=$(($n_cores * 1)) numactl -m 0 -C 0-$(($n_cores * 1 - 1)) \ + python scripts/perplexity.py --model_name "$model_path" --dataset_name "$ppl_dataset" --quantized_weight_path "$quantized_weight_path" --ctx_size $ppl_nctx --n_threads $n_cores --memory_dtype $memory_dtype 2>&1 | + tee "$WORKSPACE/$ppl_task_name.log" + mv out/ppl.png "$WORKSPACE/$ppl_task_name.png" + mv out/ppl_data.json "$WORKSPACE/$ppl_task_name.json" + done + done + done + echo "======= PPL Evaluation End =======" +} + +declare -A model_name_map +model_name_map["llama-2-7b-chat"]="meta-llama/Llama-2-7b-chat-hf" +model_name_map["gptj-6b"]="EleutherAI/gpt-j-6b" +model_name_map["gpt-neox-20b"]="EleutherAI/gpt-neox-20b" +model_name_map["mpt-7b"]="mosaicml/mpt-7b" +model_name_map["falcon-7b"]="tiiuae/falcon-7b" +model_name_map["starcoder-3b"]="bigcode/starcoder" +model_name_map["bloom-7b"]="bigscience/bloom-7b1" +model_name_map["opt-1.3b"]="facebook/opt-1.3b" +model_name_map["dolly-v2-3b"]="databricks/dolly-v2-3b" +model_name_map["chatglm2"]="THUDM/chatglm2-6b" +model_name_map["chatglm-6b"]="THUDM/chatglm-6b" +model_name_map["baichuan2-13b"]="baichuan-inc/Baichuan2-13B-Chat" +model_name_map["baichuan-13b"]="baichuan-inc/Baichuan-13B-Chat" +model_name_map["mistral-7b"]="mistralai/Mistral-7B-v0.1" +model_name_map["qwen-7b"]="Qwen/Qwen-7B-Chat" +model_name_map["magicoder"]="ise-uiuc/Magicoder-S-DS-6.7B" +model_name_map["whisper"]="openai/whisper-tiny" + +function main() { + conda_env="$1" + model="$2" + working_dir="$3" # The "graph" directory with CMakeFile.txt + compiler_version="$4" + export log_prefix="$5" # The log url prefix + + PROMPTS_PATH="$script_dir/cpp_graph_prompts.json" + convert_script="$working_dir/neural_speed/convert/" + # init params + precision_list=() + requirements_file="requirements.txt" # some models need extra constraints + + model_name="${model_name_map["$model"]}" + + if [[ -n "$local_models" ]]; then + model_path=$(python -c "import sys, json; print(json.load(sys.stdin).get('$model_name', '$model_name'))" <"$local_models") + else + model_path=$model_name + fi + + if [[ "${model}" == "llama-2-7b-chat" ]]; then + quant_script="./build/bin/quant_llama" + convert_script="${convert_script}/convert_llama.py" + infer_cmd="./build/bin/run_llama" + precision_list+=( # Our "main model" + "q4_j1_i8_g128" "q4_j_f32_g128" "q4_1" "q8_0" + "q8e4m3_j_f32_g128" "q8e4m3_j_f32_g128_fp8" "q8e5m2_j_f32_g128" "q8e5m2_j_f32_g128_fp8" + "q4e2m1_j_f32_g128" "nf4_j_f32_g128" + ) + elif [[ "${model}" == "gptj-6b" ]]; then + quant_script="./build/bin/quant_gptj" + convert_script="${convert_script}/convert_gptj.py" + infer_cmd="./build/bin/run_gptj" + precision_list+=("q4_j1_i8_g128" "q4_j1_bf16_pc") + elif [[ "${model}" == "gpt-neox-20b" ]]; then + quant_script="./build/bin/quant_gptneox" + convert_script="${convert_script}/convert_gptneox.py" + infer_cmd="./build/bin/run_gptneox" + elif [[ "${model}" == "mpt-7b" ]]; then + quant_script="./build/bin/quant_mpt" + convert_script="${convert_script}/convert_mpt.py" + infer_cmd="./build/bin/run_mpt" + elif [[ "${model}" == "falcon-7b" ]]; then + quant_script="./build/bin/quant_falcon" + convert_script="${convert_script}/convert_falcon.py" + infer_cmd="./build/bin/run_falcon" + elif [[ "${model}" == "starcoder-3b" ]]; then + quant_script="./build/bin/quant_starcoder" + convert_script="${convert_script}/convert_starcoder.py" + infer_cmd="./build/bin/run_starcoder" + elif [[ "${model}" == "bloom-7b" ]]; then + quant_script="./build/bin/quant_bloom" + convert_script="${convert_script}/convert_bloom.py" + infer_cmd="./build/bin/run_bloom" + elif [[ "${model}" == "opt-1.3b" ]]; then + quant_script="./build/bin/quant_opt" + convert_script="${convert_script}/convert_opt.py" + infer_cmd="./build/bin/run_opt" + elif [[ "${model}" == "dolly-v2-3b" ]]; then + quant_script="./build/bin/quant_dolly" + convert_script="${convert_script}/convert_dolly.py" + infer_cmd="./build/bin/run_dolly" + elif [[ "${model}" == "chatglm2" ]]; then + quant_script="./build/bin/quant_chatglm2" + convert_script="${convert_script}/convert_chatglm.py" + infer_cmd="./build/bin/run_chatglm2" + elif [[ "${model}" == "chatglm-6b" ]]; then + quant_script="./build/bin/quant_chatglm" + convert_script="${convert_script}/convert_chatglm.py" + infer_cmd="python ./scripts/inference.py" + extension=" --model_name chatglm --tokenizer $model_path" + requirements_file="scripts/requirements/chatglm-6b.sh" + elif [[ "${model}" == "baichuan2-13b" ]]; then + quant_script="./build/bin/quant_baichuan" + convert_script="${convert_script}/convert_baichuan.py" + infer_cmd="python ./scripts/inference.py" + requirements_file="scripts/requirements/baichuan.sh" + extension=" --model_name baichuan --tokenizer $model_path" + elif [[ "${model}" == "baichuan-13b" ]]; then + quant_script="./build/bin/quant_baichuan" + convert_script="${convert_script}/convert_baichuan.py" + infer_cmd="python ./scripts/inference.py" + extension=" --model_name baichuan --tokenizer $model_path" + requirements_file="scripts/requirements/baichuan.sh" + elif [[ "${model}" == "mistral-7b" ]]; then + quant_script="./build/bin/quant_mistral" + convert_script="${convert_script}/convert_mistral.py" + infer_cmd="./build/bin/run_mistral" + requirements_file="scripts/requirements/mistral.txt" + elif [[ "${model}" == "qwen-7b" ]]; then + quant_script="./build/bin/quant_qwen" + convert_script="${convert_script}/convert_qwen.py" + infer_cmd="./build/bin/run_qwen" + elif [[ "${model}" == "magicoder" ]]; then + quant_script="./build/bin/quant_llama" + convert_script="${convert_script}/convert_bmagicoder.py" + infer_cmd="./build/bin/run_llama" + elif [[ "${model}" == "whisper" ]]; then + quant_script="./build/bin/quant_whisper" + convert_script="${convert_script}/convert_whisper.py" + infer_cmd="./build/bin/run_whisper" + precision_list+=("q4_0") + else + echo "Error: Unexpedted model: $model" 1>&2 + exit 1 + fi + + if [[ $(lscpu | grep i9-12900 | wc -l) != 0 ]]; then + cores_list=(16) + quant_nthr=12 + precision_list+=("q4_j_f32_g128") + fi + + # add additional precisions + declare -A precisions_seen + for p in "${precision_list[@]}"; do + precisions_seen[$p]=x + done + if [[ "${model}" != "whisper" ]]; then + for p in "${extra_precision_list[@]}"; do + [[ ${precisions_seen[$p]} ]] && continue + precision_list+=("$p") + precisions_seen[$p]=x + done + fi + + # init conda + #. $(dirname ${CONDA_EXE})/../etc/profile.d/conda.sh + conda activate $conda_env || source activate $conda_env + pip install cmake ninja psutil + if [[ "${compiler_version}" != "12.1.0" ]]; then + conda install --update-deps -c conda-forge gxx==${compiler_version} gcc==${compiler_version} gxx_linux-64==${compiler_version} libstdcxx-ng sysroot_linux-64 -y + fi + + # setup conda env for LLM + + # get cpu info + # sockets=$(lscpu |grep 'Socket(s):' |sed 's/.*://;s/ //g') + # cores_per_instance=$(lscpu |grep 'Core(s) per socket:' |sed 's/.*://;s/ //g') + + # compile binary + cd ${working_dir} + mkdir build + cd build + cmake .. -G Ninja + ninja + cd .. + + ## prepare example requiement + if [[ $requirements_file == *'.txt' ]]; then + pip install -r "$requirements_file" + elif [[ $requirements_file == *'.sh' ]]; then + source "$requirements_file" + else + echo "Error: Unexpedted requirements_file: $requirements_file" 1>&2 + exit 1 + fi + + echo "======= Convert Start =======" + ## prepare fp32 bin + python ${convert_script} --outtype f32 --outfile ${working_dir}/${model}-fp32.bin ${model_path} + echo "======= Convert End =======" + + # launch benchmark + for cores_per_instance_idx in "${!cores_list[@]}"; do + cores_per_instance=${cores_list[cores_per_instance_idx]} + for batch_size_idx in "${!batch_size_list[@]}"; do + batch_size=${batch_size_list[batch_size_idx]} + for input_idx in "${!input_list[@]}"; do + input=${input_list[input_idx]} + for precision_idx in "${!precision_list[@]}"; do + precision=${precision_list[precision_idx]} + # [[ "${input}" == "32" ]] && output=32 || + if [[ "${input}" == "10" ]]; then output=1024; else output=32; fi + if [[ "${model}" == "chatglm2" || "${model}" == "chatglm-6b" || "${model}" == "baichuan-13b" || "${model}" == "baichuan2-13b" ]]; then + output=32 + fi + prompt=$(python -c "import sys, json; i = json.load(sys.stdin)['$input']; print(i['prompts'][i['map'].get('$model', 'default')])" <$PROMPTS_PATH) + + if [[ -z $prompt ]]; then + echo "Error: Unexpedted input: $input" 1>&2 + continue + fi + ctx=$(($output + $input + 10)) + if [[ "$drop_caches" = true ]]; then + sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches' + fi + task_name="${model}-${precision}-${cores_per_instance}-${batch_size}-${input}-${output}" + logs_file="${task_name}.log" + ## prepare model.bin + if [[ ! -f ${working_dir}/${model}-${precision}.bin ]]; then + echo "======= Quantization Start =======" + local quant_script_prologue="'$quant_script' --model_file '$working_dir/$model-fp32.bin' --out_file '$working_dir/$model-$precision.bin' --nthread $quant_nthr" # in case there are space in the path + if [[ ${precision} == "q4_j_i8_g128" ]]; then + eval "$quant_script_prologue --weight_dtype int4 --group_size 128 --compute_dtype int8 --scale_dtype fp32 --alg sym" + # deprecated since bfloat16 scale not mature + # elif [[ ${precision} == "q4_j_i8_g32_bf16" ]]; then + # eval "$quant_script_prologue --weight_dtype int4 --group_size 32 --compute_dtype int8 --scale_dtype bf16 --alg sym" + elif [[ ${precision} == "q4_j_i8_g32" ]]; then + eval "$quant_script_prologue --weight_dtype int4 --group_size 32 --compute_dtype int8 --scale_dtype fp32 --alg sym" + elif [[ ${precision} == "q4_j_f32_g128" ]]; then + eval "$quant_script_prologue --weight_dtype int4 --group_size 128 --compute_dtype fp32 --scale_dtype fp32 --alg sym" + elif [[ ${precision} == "q4_j1_i8_g128" ]]; then + eval "$quant_script_prologue --weight_dtype int4 --group_size 128 --compute_dtype int8 --scale_dtype fp32 --alg asym" + elif [[ ${precision} == "q4_j1_bf16_pc" ]]; then + eval "$quant_script_prologue --weight_dtype int4 --group_size -1 --compute_dtype bf16 --scale_dtype fp32 --alg asym" + elif [[ ${precision} == "q4_0" ]]; then + eval "$quant_script_prologue --weight_dtype int4 --group_size 32 --compute_dtype int8 --alg sym --use_ggml" + elif [[ ${precision} == "q4_1" ]]; then + eval "$quant_script_prologue --weight_dtype int4 --group_size 32 --compute_dtype int8 --alg asym --use_ggml" + elif [[ ${precision} == "q8_0" ]]; then + eval "$quant_script_prologue --weight_dtype int8 --group_size 32 --compute_dtype int8 --alg sym --use_ggml" + elif [[ ${precision} == "q8e4m3_j_f32_g128" ]]; then + eval "$quant_script_prologue --weight_dtype fp8 --group_size 128 --scale_dtype fp32 --compute_dtype fp32 --alg sym" + elif [[ ${precision} == "q8e4m3_j_f32_g128_fp8" ]]; then + eval "$quant_script_prologue --weight_dtype fp8 --group_size 128 --scale_dtype fp8 --compute_dtype fp32 --alg sym" + elif [[ ${precision} == "q4e2m1_j_f32_g128" ]]; then + eval "$quant_script_prologue --weight_dtype fp4 --group_size 128 --scale_dtype fp32 --compute_dtype fp32 --alg sym" + elif [[ ${precision} == "q8e5m2_j_f32_g128" ]]; then + eval "$quant_script_prologue --weight_dtype fp8_e5m2 --group_size 128 --scale_dtype fp32 --compute_dtype fp32 --alg sym" + elif [[ ${precision} == "q8e5m2_j_f32_g128_fp8" ]]; then + eval "$quant_script_prologue --weight_dtype fp8_e5m2 --group_size 128 --scale_dtype fp8 --compute_dtype fp32 --alg sym" + elif [[ ${precision} == "nf4_j_f32_g128" ]]; then + eval "$quant_script_prologue --weight_dtype nf4 --group_size 128 --scale_dtype fp32 --compute_dtype fp32 --alg sym" + else + echo "Error: Unexpedted precision: $precision" 1>&2 + continue + fi + echo "======= Quantization End =======" + fi + ## run inference + export LANG=en_US.UTF-8 + export LC_ALL=en_US.UTF-8 + echo "======= Inference Start =======" + if [[ "${model}" == "whisper" ]];then OMP_NUM_THREADS=$cores_per_instance numactl -m 0 -C 0-$(($cores_per_instance - 1)) \ + $infer_cmd -f "/tf_dataset2/models/nlp_toolkit/whisper-tiny/jfk.wav" -m ${model}-${precision}.bin + else + real_ctx=$ctx # TODO(Zhenzhong): use same ctx for chatglm & baichuan + [[ "${model}" == "chatglm2" || "${model}" == "chatglm-6b" || + "${model}" == "baichuan-13b" || "${model}" == "baichuan2-13b" ]] && real_ctx=2047 + + OMP_NUM_THREADS=$cores_per_instance numactl -m 0 -C 0-$(($cores_per_instance - 1)) \ + $infer_cmd --seed 1234 -t $cores_per_instance -b 2047 -c $real_ctx -n ${output} -m ${model}-${precision}.bin $extension -p "$prompt" 2>&1 | tee ${WORKSPACE}/${logs_file} || true & + monitor + + echo "======= Inference End =======" + python $script_dir/calculate_percentiles.py ${WORKSPACE}/${logs_file} ${model} ${precision} ${cores_per_instance} ${batch_size} ${input} ${output} + fi + if [[ "$cores_per_instance" == "${cores_list[@]: -1:1}" ]] && + [[ "$batch_size_idx" == "0" ]] && + [[ "$input_idx" == "0" ]] && + [[ "${#ppl_nctx_list[@]}" != "0" ]]; then + ppl_eval "$task_name" "$cores_per_instance" "$model_path" "$model-$precision.bin" + fi + done + done + done + done + if [[ "${#ppl_nctx_list[@]}" != "0" ]] && [[ "$ppl_fp32_test" = true ]]; then + cores_per_instance="${cores_list[@]: -1:1}" + task_name="${model}-fp32-${cores_per_instance}-${batch_size_list[@]:0:1}-${input_list[@]:0:1}-${output}" + ppl_eval "$task_name" "$cores_per_instance" "$model_path" "$model-fp32.bin" + fi + conda deactivate >/dev/null 2>&1 +} + +function monitor() { + sleep 1 + # try first time + if [ $(ps -ef | grep "$infer_cmd" | wc -l) -lt 2 ]; then + sleep 1 + fi + # keep monitoring + echo "====== Monitor Start =======" + while true; do + if [ $(ps -ef | grep "$infer_cmd" | wc -l) -lt 2 ]; then + sleep 3 + break + fi + echo "$(date +%s), $(numastat -p $(ps -ef | grep "$infer_cmd" | grep -v grep | awk '{printf("%s ", $2)}'))" \ + >>${WORKSPACE}/memory.txt 2>&1 + done + echo "====== Monitor End =======" +} + +main $@ 2>&1 | tee ${WORKSPACE}/launch.log diff --git a/tests/model-test/cpp_graph_prompts.json b/tests/model-test/cpp_graph_prompts.json new file mode 100644 index 000000000..9d234a677 --- /dev/null +++ b/tests/model-test/cpp_graph_prompts.json @@ -0,0 +1,57 @@ +{ + "10": { + "map": {}, + "prompts": { + "default": "Once upon a time, there existed a " + } + }, + "32": { + "map": { + "llama-2-7b-chat": "llama", + "chatglm2": "chinese1", + "baichuan2-13b": "chinese1", + "chatglm-6b": "chinese2", + "baichuan-13b": "chinese2" + }, + "prompts": { + "default": "Once upon a time, there existed a little girl, who liked to have adventures. She wanted to go to places and meet new people, and have fun.", + "llama": "Once upon a time, there existed a little girl who liked to have adventures. She wanted to go to places and meet new people, and have fun", + "chinese1": "\"和我一起出去打个篮球玩玩吧一起出去打个篮球玩玩吧!\"", + "chinese2": "\"它完成了,并提交了。你可以在Android和网络上玩“美味生存”。在网络上玩是有效的,但你必须模拟多次触摸才能移动桌子.\"" + } + }, + "1024": { + "map": { + "llama-2-7b-chat": "llama", + "gptj-6b": "gptj-6b", + "chatglm2": "chinese1", + "baichuan-13b": "chinese1", + "baichuan2-13b": "chinese1", + "chatglm-6b": "chinese2" + }, + "prompts": { + "default": "It is done, and submitted. You can play 'Survival of the Tastiest' on the Android, and on the web. Playing on the web works, but you have to simulate multiple touch for table moving and that can be a bit confusing. There is a lot I'd like to talk about. I will go through every topic, insted of making the typical what went right/wrong list. Concept Working over the theme was probably one of the hardest tasks which I had to face. Originally, I had an idea of what kind of game I wanted to develop, gameplay wise - something with a lot of enemies/actors, simple graphics, maybe set in the space, controlled from a top-down view. I was confident that I could fit any theme around it. In the end, the problem with a theme like 'Evolution' in a game is that evolution is unassisted. It happens through several seemingly random mutations over time, with the most apt permutation surviving. This genetic car simulator is, in my opinion, a great example of actual evolution of a species facing a challenge. But is it a game? In a game, you need to control something to reach an objective. That control goes against what evolution is supposed to be like. If you allow the user to pick how to evolve something, it's not evolution anymore - it's the equivalent of intelligent design, the fable invented by creationists to combat the idea of evolution. Being agnostic and a Pastafarian, that's not something that rubbed me the right way. Hence, my biggest dillema when deciding what to create was not with what I wanted to create, but with what I did not. I didn't want to create an 'intelligent design' simulator and wrongly call it evolution. This is a problem, of course, every other contestant also had to face it. And judging by the entries submitted, not many managed to work around it. I'd say the only real solution was through the use of artificial selection, somehow. So far, I haven't seen any entry using this at its core gameplay. Alas, this is just a fun competition and after a while I decided not to be as strict with the game idea, and allowed myself to pick whatever I thought would work out. My initial idea was to create something where humanity tried to evolve to a next level, but had some kind of foe trying to stop them from doing so. I kind of had this image of human souls flying in space towards a monolith or a space baby (all based in 2001: A Space Odyssey of course) but I couldn't think of compelling (read: serious) mechanics for that. Borgs were my next inspiration, as their whole hypothesis fit pretty well into the evolution theme. But how to make it work? Are you the borg, or fighting the Borg? The third and final idea came to me through my girlfriend, who somehow gave me the idea of making something about the evolution of Pasta. The more I thought about it the more it sounded like it would work, so I decided to go with it. Conversations with my inspiring co-worker Roushey (who also created the 'Mechanical Underdogs' signature logo for my intros) further matured the concept, as it involved into the idea of having individual pieces of pasta flying around and trying to evolve until they became all-powerful. A secondary idea here was that the game would work to explain how the Flying Spaghetti Monster came to exist - by evolving from a normal dinner table. So the idea evolved more or less into this: you are sitting a table. You have your own plate, with is your 'base'. There are 5 other guests at the table, each with their own plate. Your plate can spawn little pieces of pasta. You do so by 'ordering' them through a menu. Some pastas are better than others; some are faster, some are stronger. They have varying 'costs', which are debited from your credits (you start with a number of credits). Once spawned, your pastas start flying around. Their instinct is to fly to other plates, in order to conquer them (the objective of the game is having your pasta conquer all the plates on the table). But they are really autonomous, so after being spawned, you have no control over your pasta (think DotA or LoL creeps). Your pasta doesn't like other people's pasta, so if they meet, they shoot sauce at each other until one dies. You get credits for other pastas your own pasta kill.", + "llama": "It is done, and submitted. You can play 'Survival of the Tastiest' on Android, and on the web. Playing on the web works, but you have to simulate multiple touch for table moving and that can be a bit confusing. There is a lot I'd like to talk about. I will go through every topic, insted of making the typical what went right/wrong list. Concept Working over the theme was probably one of the hardest tasks which I had to face. Originally, I had an idea of what kind of game I wanted to develop, gameplay wise - something with a lot of enemies/actors, simple graphics, maybe set in space, controlled from a top-down view. I was confident that I could fit any theme around it. In the end, the problem with a theme like 'Evolution' in a game is that evolution is unassisted. It happens through several seemingly random mutations over time, with the most apt permutation surviving. This genetic car simulator is, in my opinion, a great example of actual evolution of a species facing a challenge. But is it a game? In a game, you need to control something to reach an objective. That control goes against what evolution is supposed to be like. If you allow the user to pick how to evolve something, it's not evolution anymore - it's the equivalent of intelligent design, the fable invented by creationists to combat the idea of evolution. Being agnostic and a Pastafarian, that's not something that rubbed me the right way. Hence, my biggest dillema when deciding what to create was not with what I wanted to create, but with what I did not. I didn't want to create an 'intelligent design' simulator and wrongly call it evolution. This is a problem, of course, every other contestant also had to face. And judging by the entries submitted, not many managed to work around it. I'd say the only real solution was through the use of artificial selection, somehow. So far, I have not seen any entry using this at its core gameplay. Alas, this is just a fun competition and after a while I decided not to be as strict with the game idea, and allowed myself to pick whatever I thought would work out. My initial idea was to create something where humanity tried to evolve to a next level but had some kind of foe trying to stop them from doing so. I kind of had this image of human souls flying in space towards a monolith or a space baby (all based in 2001: A Space Odyssey of course) but I couldn't think of compelling (read: serious) mechanics for that. Borgs were my next inspiration, as their whole hypothesis fit pretty well into the evolution theme. But how to make it work? Are you the borg, or fighting the Borg? The third and final idea came to me through my girlfriend, who somehow gave me the idea of making something about the evolution of Pasta. The more I thought about it the more it sounded like it would work, so I decided to go with it. Conversations with my inspiring co-worker Roushey (who also created the 'Mechanical Underdogs' signature logo for my intros) further matured the concept, as it involved into the idea of having individual pieces of pasta flying around and trying to evolve until they became all-powerful. A secondary idea here was that the game would work to explain how the Flying Spaghetti Monster came to exist - by evolving from a normal dinner table. So the idea evolved more or less into this: you are sitting a table. You have your own plate, with is your 'base'. There are 5 other guests at the table, each with their own plate. Your plate can spawn little pieces of pasta. You do so by 'ordering' them through a menu. Some pastas are better than others; some are faster, some are stronger. They have varying 'costs', which are debited from your credits (you start with a number of credits). Once spawned, your pastas start flying around. Their instinct is to fly to other plates, in order to conquer them (the objective of the game is having your pasta conquer all the plates on the table). But they are really autonomous, so after being spawned, you have no control over your pasta (think DotA or LoL creeps). Your pasta doesn't like other people's pasta, so if they meet, they shoot sauce at each other until one dies. You get credits for other pastas your own pasta kill. Once a pasta is in the vicinity of a plate,", + "gptj-6b": "It is done, and submitted. You can play 'Survival of the Tastiest' on Android, and on the web. Playing on the web works, but you have to simulate multiple touch for table moving and that can be a bit confusing. There is a lot I'd like to talk about. I will go through every topic, insted of making the typical what went right/wrong list. Concept Working over the theme was probably one of the hardest tasks which I had to face. Originally, I had an idea of what kind of game I wanted to develop, gameplay wise - something with a lot of enemies/actors, simple graphics, maybe set in space, controlled from a top-down view. I was confident that I could fit any theme around it. In the end, the problem with a theme like 'Evolution' in a game is that evolution is unassisted. It happens through several seemingly random mutations over time, with the most apt permutation surviving. This genetic car simulator is, in my opinion, a great example of actual evolution of a species facing a challenge. But is it a game? In a game, you need to control something to reach an objective. That control goes against what evolution is supposed to be like. If you allow the user to pick how to evolve something, it's not evolution anymore - it's the equivalent of intelligent design, the fable invented by creationists to combat the idea of evolution. Being agnostic and a Pastafarian, that's not something that rubbed me the right way. Hence, my biggest dillema when deciding what to create was not with what I wanted to create, but with what I did not. I didn't want to create an 'intelligent design' simulator and wrongly call it evolution. This is a problem, of course, every other contestant also had to face. And judging by the entries submitted, not many managed to work around it. I'd say the only real solution was through the use of artificial selection, somehow. So far, I haven't seen any entry using this at its core gameplay. Alas, this is just a fun competition and after a while I decided not to be as strict with the game idea, and allowed myself to pick whatever I thought would work out. My initial idea was to create something where humanity tried to evolve to a next level, but had some kind of foe trying to stop them from doing so. I kind of had this image of human souls flying in space towards a monolith or a space baby (all based in 2001: A Space Odyssey of course) but I couldn't think of compelling (read: serious) mechanics for that. Borgs were my next inspiration, as their whole hypothesis fit pretty well into the evolution theme. But how to make it work? Are you the borg, or fighting the Borg? The third and final idea came to me through my girlfriend, who somehow gave me the idea of making something about the evolution of Pasta. The more I thought about it the more it sounded like it would work, so I decided to go with it. Conversations with my inspiring co-worker Roushey (who also created the 'Mechanical Underdogs' signature logo for my intros) further matured the concept, as it involved into the idea of having individual pieces of pasta flying around and trying to evolve until they became all-powerful. A secondary idea here was that the game would work to explain how the Flying Spaghetti Monster came to exist - by evolving from a normal dinner table. So the idea evolved more or less into this: you are sitting a table. You have your own plate, with is your 'base'. There are 5 other guests at the table, each with their own plate. Your plate can spawn little pieces of pasta. You do so by 'ordering' them through a menu. Some pastas are better than others; some are faster, some are stronger. They have varying 'costs', which are debited from your credits (you start with a number of credits). Once spawned, your pastas start flying around. Their instinct is to fly to other plates, in order to conquer them (the objective of the game is having your pasta conquer all the plates on the table). But they are really autonomous, so after being spawned, you have no control over your pasta (think DotA or LoL creeps). Your pasta doesn't like other people's pasta, so if they meet, they shoot sauce at each other until one dies. You get credits for other pastas your own pasta kill. Once a pasta is in the vicinity of a plate, it starts conquering it for its team. It takes around 10 seconds for a plate to be conquered; less if more pasta from the same team are around. If pasta from other team are around, though, they get locked down in their attempt, unable to conquer the plate, until one of them die (think Battlefield's standard 'Conquest' mode). You get points every second for every plate you own. Over time, the concept", + "chinese1": "\"它完成了,并提交了。你可以在Android和网络上玩“美味生存”。在网络上玩是有效的,但你必须模拟多次触摸才能移动桌子,这可能会有点令人困惑。我想谈的有很多。我将浏览每个主题,而不是列出典型的正确/错误列表。概念 围绕这个主题工作可能是我必须面对的最艰巨的任务之一。最初,我有一个想法,我想开发什么样的游戏,游戏玩法明智有很多敌人/演员的东西,简单的图形,可能设置在太空中,从自上而下的视图控制。我相信我可以围绕它适合任何主题。最后,游戏中像“进化”这样的主题的问题在于进化是无辅助的。随着时间的推移,它通过几个看似随机的突变发生,最合适的排列幸存下来。在我看来,这个基因汽车模拟器是面临挑战的物种实际进化的一个很好的例子。但这是游戏吗?在游戏中,您需要控制某些东西才能达到目标。这种控制违背了进化应该是什么样子。如果你允许用户选择如何进化某些东西,它就不再是进化了——它相当于智能设计,是创造论者发明的寓言,用来对抗进化论的想法。作为不可知论者和意大利面主义者,这不是以正确的方式摩擦我的东西。因此,在决定创作什么时,我最大的困惑不是我想创造什么,而是我不想要创造什么。我不想创建一个“智能设计”模拟器,并错误地称之为进化。这是一个问题,当然,其他参赛者也都要面对。从提交的条目来看,没有多少人设法解决这个问题。我想说,唯一真正的解决方案是通过使用人工选择,不知何故。到目前为止,我还没有看到任何条目在其核心游戏玩法中使用它。唉,这只是一个有趣的比赛,过了一段时间,我决定不那么严格地要求游戏理念,并允许自己选择我认为可行的任何内容。我最初的想法是创造一些东西,让人类试图进化到一个新的水平,但有某种敌人试图阻止他们这样做。我有点像人类灵魂在太空中飞向巨石或太空婴儿的图像(当然都是基于2001:太空漫游),但我想不出令人信服的(阅读:严肃的)机制。博格人是我的下一个灵感来源,因为他们的整个假设非常符合进化论的主题。但是如何让它工作呢?你是博格人,还是与博格人战斗?你是博格人,还是与博格人战斗?它完成了,并提交了。你可以在Android和网络上玩“美味生存”。在网络上玩是有效的,但你必须模拟多次触摸才能移动桌子,这可能会有点令人困惑。我想谈的有很多。我将浏览每个主题,而不是列出典型的正确/错误列表。概念围绕这个主题工作可能是我必须面对的最艰巨的任务之一。最初,我有一个想法,我想开发什么样的游戏,游戏玩法明智有很多敌人/演员的东西,简单的图形,可能设置在太空中,从自上而下的视图控制。我相信我可以围绕它适合任何主题。最后,游戏中像“进化”这样的主题的问题在于进化是无辅助的。随着时间的推移,它通过几个看似随机的突变发生,最合适的排列幸存下来。在我看来,这个基因汽车模拟器是面临挑战的物种实际进化的一个很好的例子。但这是游戏吗?在游戏中,您需要控制某些东西才能达到目标。这种控制违背了进化应该是什么样子。如果你允许用户选择如何进化某些东西,它就不再是进化了——它相当于智能设计,是创造论者发明的寓言,用来对抗进化论的想法。作为不可知论者和意大利面主义者,这不是以正确的方式摩擦我的东西。因此,在决定创作什么时,我最大的困惑不是我想创造什么,而是我不想要创造什么。我不想创建一个“智能设计”模拟器,并错误地称之为进化。这是一个问题,当然,其他参赛者也都要面对。从提交的条目来看,没有多少人设法解决这个问题。我想说,唯一真正的解决方案是通过使用人工选择,不知何故。到目前为止,我还没有看到任何条目在其核心游戏玩法中使用它。唉,这只是一个有趣的比赛,过了一段时间,我决定不那么严格地要求游戏理念,并允许自己选择我认为可行的任何内容。我最初的想法是创造一些东西,让人类试图进化到一个新的水平,但有某种敌人试图阻止他们这样做。我有点像人类灵魂在太空中飞向巨石或太空婴儿的图像(当然都是基于2001:太空漫游),但我想不出令人信服的(阅读:严肃的)机制。博格人是我的下一个灵感来源,因为他们的整个假设非常符合进化论的主题。但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?工作呢?\"", + "chinese2": "\"它完成了,并提交了。你可以在Android和网络上玩“美味生存”。在网络上玩是有效的,但你必须模拟多次触摸才能移动桌子,这可能会有点令人困惑。我想谈的有很多。我将浏览每个主题,而不是列出典型的正确/错误列表。概念 围绕这个主题工作可能是我必须面对的最艰巨的任务之一。最初,我有一个想法,我想开发什么样的游戏,游戏玩法明智有很多敌人/演员的东西,简单的图形,可能设置在太空中,从自上而下的视图控制。我相信我可以围绕它适合任何主题。最后,游戏中像“进化”这样的主题的问题在于进化是无辅助的。随着时间的推移,它通过几个看似随机的突变发生,最合适的排列幸存下来。在我看来,这个基因汽车模拟器是面临挑战的物种实际进化的一个很好的例子。但这是游戏吗?在游戏中,您需要控制某些东西才能达到目标。这种控制违背了进化应该是什么样子。如果你允许用户选择如何进化某些东西,它就不再是进化了——它相当于智能设计,是创造论者发明的寓言,用来对抗进化论的想法。作为不可知论者和意大利面主义者,这不是以正确的方式摩擦我的东西。因此,在决定创作什么时,我最大的困惑不是我想创造什么,而是我不想要创造什么。我不想创建一个“智能设计”模拟器,并错误地称之为进化。这是一个问题,当然,其他参赛者也都要面对。从提交的条目来看,没有多少人设法解决这个问题。我想说,唯一真正的解决方案是通过使用人工选择,不知何故。到目前为止,我还没有看到任何条目在其核心游戏玩法中使用它。唉,这只是一个有趣的比赛,过了一段时间,我决定不那么严格地要求游戏理念,并允许自己选择我认为可行的任何内容。我最初的想法是创造一些东西,让人类试图进化到一个新的水平,但有某种敌人试图阻止他们这样做。我有点像人类灵魂在太空中飞向巨石或太空婴儿的图像(当然都是基于2001:太空漫游),但我想不出令人信服的(阅读:严肃的)机制。博格人是我的下一个灵感来源,因为他们的整个假设非常符合进化论的主题。但是如何让它工作呢?你是博格人,还是与博格人战斗?你是博格人,还是与博格人战斗?它完成了,并提交了。你可以在Android和网络上玩“美味生存”。在网络上玩是有效的,但你必须模拟多次触摸才能移动桌子,这可能会有点令人困惑。我想谈的有很多。我将浏览每个主题,而不是列出典型的正确/错误列表。概念围绕这个主题工作可能是我必须面对的最艰巨的任务之一。最初,我有一个想法,我想开发什么样的游戏,游戏玩法明智有很多敌人/演员的东西,简单的图形,可能设置在太空中,从自上而下的视图控制。我相信我可以围绕它适合任何主题。最后,游戏中像“进化”这样的主题的问题在于进化是无辅助的。随着时间的推移,它通过几个看似随机的突变发生,最合适的排列幸存下来。在我看来,这个基因汽车模拟器是面临挑战的物种实际进化的一个很好的例子。但这是游戏吗?在游戏中,您需要控制某些东西才能达到目标。这种控制违背了进化应该是什么样子。如果你允许用户选择如何进化某些东西,它就不再是进化了——它相当于智能设计,是创造论者发明的寓言,用来对抗进化论的想法。作为不可知论者和意大利面主义者,这不是以正确的方式摩擦我的东西。因此,在决定创作什么时,我最大的困惑不是我想创造什么,而是我不想要创造什么。我不想创建一个“智能设计”模拟器,并错误地称之为进化。这是一个问题,当然,其他参赛者也都要面对。从提交的条目来看,没有多少人设法解决这个问题。我想说,唯一真正的解决方案是通过使用人工选择,不知何故。到目前为止,我还没有看到任何条目在其核心游戏玩法中使用它。唉,这只是一个有趣的比赛,过了一段时间,我决定不那么严格地要求游戏理念,并允许自己选择我认为可行的任何内容。我最初的想法是创造一些东西,让人类试图进化到一个新的水平,但有某种敌人试图阻止他们这样做。我有点像人类灵魂在太空中飞向巨石或太空婴儿的图像(当然都是基于2001:太空漫游),但我想不出令人信服的(阅读:严肃的)机制。博格人是我的下一个灵感来源,因为他们的整个假设非常符合进化论的主题。但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?工作呢?它完成了,并提交了。你可以在Android和网络上玩“美味生存”。在网络上玩是有效的,但你必须模拟多次触摸才能移动桌子,这可能会有点令人困惑。我想谈的有很多。我将浏览每个主题,而不是列出典型的正确/错误列表。概念围绕这个主题工作可能是我必须面对的最艰巨的任务之一。概念围绕这个主题工作可能是我必须面对的最艰巨的任务之一。但是必须概念围绕这个主题工作但是必须概念围绕这个主题工作\"" + } + }, + "2012": { + "map": { + "llama-2-7b-chat": "llama", + "mistral-7b": "llama", + "chatglm2": "chinese1", + "baichuan-13b": "chinese1", + "baichuan2-13b": "chinese1", + "chatglm-6b": "chinese2" + }, + "prompts": { + "default": "It is done, and submitted. You can play 'Survival of the Tastiest' on Android, and on web. Playing on web works, but you have to simulate multiple touch for table moving and that can be a bit confusing. There is a lot I'd like to talk about. I will go through every topic, insted of making the typical what went right/wrong list. Concept Working over the theme was probably one of the hardest tasks which I had to face. Originally, I had an idea of what kind of game I wanted to develop, gameplay wise - something with a lot of enemies/actors, simple graphics, maybe set in space, controlled from a top-down view. I was confident that I could fit any theme around it. In the end, the problem with a theme like 'Evolution' in a game is that evolution is unassisted. It happens through several seemingly random mutations over time, with the most apt permutation surviving. This genetic car simulator is, in my opinion, a great example of actual evolution of a species facing a challenge. But is it a game? In a game, you need control something to reach an objective. That control goes against what evolution is supposed to be like. If you allow the user to pick how to evolve something, it's not evolution anymore - it's the equivalent of intelligent design, the fable invented by creationists to combat the idea of evolution. Being agnostic and a Pastafarian, that's not something that rubbed me the right way. Hence, my biggest dillema when deciding what to create was not with what I wanted to create, but with what I did not. I didn't want to create an 'intelligent design' simulator and wrongly call it evolution. This is a problem, of course, every other contestant also had to face. And judging by the entries submitted, not many managed to work around it. I'd say the only real solution was through the use of artificial selection, somehow. So far, I haven't seen any entry using this at its core gameplay. Alas, this is just a fun competition and after a while I decided not to be as strict with the game idea, and allowed myself to pick whatever I thought would work out. My initial idea was to create something where humanity tried to evolve to a next level, but had some kind of foe trying to stop them from doing so. I kind of had this image of human souls flying in space towards a monolith or a space baby (all based in 2001: A Space Odyssey of course) but I couldn't think of compelling (read: serious) mechanics for that. Borgs were my next inspiration, as their whole hypothesis fit pretty well into the evolution theme. But how to make it work? Are you the borg, or fighting the Borg? The third and final idea came to me through my girlfriend, who somehow gave me the idea of making something about the evolution of Pasta. The more I thought about it the more it sounded like it would work, so I decided to go with it. Conversations with my inspiring co-worker Roushey (who also created the 'Mechanical Underdogs' signature logo for my intros) further matured the concept, as it involved into the idea of having individual pieces of pasta flying around and trying to evolve until they became all-powerful. A secondary idea here was that the game would work to explain how the Flying Spaghetti Monster came to exist - by evolving from a normal dinner table. So the idea evolved more or less into this: you are sitting a table. You have your own plate, with is your 'base'. There are 5 other guests at the table, each with their own plate. Your plate can spawn little pieces of pasta. You do so by 'ordering' them through a menu. Some pastas are better than others; some are faster, some are stronger. They have varying 'costs', which are debited from your credits (you start with a number of credits). Once spawned, your pastas start flying around. Their instinct is to fly to other plates, in order to conquer them (the objective of the game is having your pasta conquer all the plates on the table). But they are really autonomous, so after being spawned, you have no control over your pasta (think DotA or LoL creeps). Your pasta doesn't like other people's pasta, so if they meet, they shoot sauce at each other until one dies. You get credits for other pastas your own pasta kill. Once a pasta is in the vicinity of a plate, it starts conquering it for its team. It takes around 10 seconds for a plate to be conquered; less if more pasta from the same team are around. If pasta from other team are around, though, they get locked down in their attempt, unable to conquer the plate, until one of them die (think Battlefield's standard 'Conquest' mode). You get points every second for every plate you own. Over time, the concept also evolved to use an Italian bistro as its main scenario. Carlos, Carlos' Bistro's founder and owner Setup No major changes were made from my work setup. I used FDT and Starling creating an Adobe AIR (ActionScript) project, all tools or frameworks I already had some knowledge with. One big change for me was that I livestreamed my work through a twitch.tv account. This was a new thing for me. As recommended by Roushey, I used a program called XSplit and I got to say, it is pretty amazing. It made the livestream pretty effortless and the features are awesome, even for the free version. It was great to have some of my friends watch me, and then interact with them and random people through chat. It was also good knowing that I was also recording a local version of the files, so I could make a timelapse video later. Knowing the video was being recorded also made me a lot more self-conscious about my computer use, as if someone was watching over my shoulder. It made me realize that sometimes I spend too much time in seemingly inane tasks (I ended up wasting the longest time just to get some text alignment the way I wanted - it'll probably drive someone crazy if they watch it) and that I do way too many typos where writing code. I pretty much spend half of the time writing a line and the other half fixing the crazy characters in it. My own stream was probably boring to watch since I was coding for the most time. But livestreaming is one of the cool things to do as a spectator too. It was great seeing other people working - I had a few tabs opened on my second monitor all the time. It's actually a bit sad, because if I could, I could have spent the whole weekend just watching other people working! But I had to do my own work, so I'd only do it once in a while, when resting for a bit. Design Although I wanted some simple, low-fi, high-contrast kind of design, I ended up going with somewhat realistic (vector) art. I think it worked very well, fitting the mood of the game, but I also went overboard. For example: to know the state of a plate (who owns it, who's conquering it and how much time they have left before conquering it, which pasta units are in the queue, etc), you have to look at the plate's bill. The problem I realized when doing some tests is that people never look at the bill! They think it's some kind of prop, so they never actually read its details. Plus, if you're zoomed out too much, you can't actually read it, so it's hard to know what's going on with the game until you zoom in to the area of a specific plate. One other solution that didn't turn out to be as perfect as I thought was how to indicate who a plate base belongs to. In the game, that's indicated by the plate's decoration - its color denotes the team owner. But it's something that fits so well into the design that people never realized it, until they were told about it. In the end, the idea of going with a full physical metaphor is one that should be done with care. Things that are very important risk becoming background noise, unless the player knows its importance. Originally, I wanted to avoid any kind of heads-up display in my game. In the end, I ended up adding it at the bottom to indicate your credits and bases owned, as well as the hideous out-of-place-and-still-not-obvious 'Call Waiter' button. But in hindsight, I should have gone with a simple HUD from the start, especially one that indicated each team's colors and general state of the game without the need for zooming in and out. Development Development went fast. But not fast enough. Even though I worked around 32+ hours for this Ludum Dare, the biggest problem I had to face in the end was overscoping. I had too much planned, and could not get it all done. Content-wise, I had several kinds of pasta planned - Wikipedia is just amazing in that regard, split into several different groups, from small Pastina to huge Pasta al forno. But because of time constraints, I ended up scratching most of them, and ended up with 5 different types of small pasta - barely something to start when talking about the evolution of Pasta. Pastas used in the game.", + "llama": "It is done, and submitted. You can play 'Survival of the Tastiest' on Android, and on the web. Playing on the web works, but you have to simulate multiple touch for table moving and that can be a bit confusing. There is a lot I'd like to talk about. I will go through every topic, insted of making the typical what went right/wrong list. Concept Working over the theme was probably one of the hardest tasks which I had to face. Originally, I had an idea of what kind of game I wanted to develop, gameplay wise - something with a lot of enemies/actors, simple graphics, maybe set in space, controlled from a top-down view. I was confident that I could fit any theme around it. In the end, the problem with a theme like 'Evolution' in a game is that evolution is unassisted. It happens through several seemingly random mutations over time, with the most apt permutation surviving. This genetic car simulator is, in my opinion, a great example of actual evolution of a species facing a challenge. But is it a game? In a game, you need to control something to reach an objective. That control goes against what evolution is supposed to be like. If you allow the user to pick how to evolve something, it's not evolution anymore - it's the equivalent of intelligent design, the fable invented by creationists to combat the idea of evolution. Being agnostic and a Pastafarian, that's not something that rubbed me the right way. Hence, my biggest dillema when deciding what to create was not with what I wanted to create, but with what I did not. I didn't want to create an 'intelligent design' simulator and wrongly call it evolution. This is a problem, of course, every other contestant also had to face. And judging by the entries submitted, not many managed to work around it. I'd say the only real solution was through the use of artificial selection, somehow. So far, I have not seen any entry using this at its core gameplay. Alas, this is just a fun competition and after a while I decided not to be as strict with the game idea, and allowed myself to pick whatever I thought would work out. My initial idea was to create something where humanity tried to evolve to a next level but had some kind of foe trying to stop them from doing so. I kind of had this image of human souls flying in space towards a monolith or a space baby (all based in 2001: A Space Odyssey of course) but I couldn't think of compelling (read: serious) mechanics for that. Borgs were my next inspiration, as their whole hypothesis fit pretty well into the evolution theme. But how to make it work? Are you the borg, or fighting the Borg? The third and final idea came to me through my girlfriend, who somehow gave me the idea of making something about the evolution of Pasta. The more I thought about it the more it sounded like it would work, so I decided to go with it. Conversations with my inspiring co-worker Roushey (who also created the 'Mechanical Underdogs' signature logo for my intros) further matured the concept, as it involved into the idea of having individual pieces of pasta flying around and trying to evolve until they became all-powerful. A secondary idea here was that the game would work to explain how the Flying Spaghetti Monster came to exist - by evolving from a normal dinner table. So the idea evolved more or less into this: you are sitting a table. You have your own plate, with is your 'base'. There are 5 other guests at the table, each with their own plate. Your plate can spawn little pieces of pasta. You do so by 'ordering' them through a menu. Some pastas are better than others; some are faster, some are stronger. They have varying 'costs', which are debited from your credits (you start with a number of credits). Once spawned, your pastas start flying around. Their instinct is to fly to other plates, in order to conquer them (the objective of the game is having your pasta conquer all the plates on the table). But they are really autonomous, so after being spawned, you have no control over your pasta (think DotA or LoL creeps). Your pasta doesn't like other people's pasta, so if they meet, they shoot sauce at each other until one dies. You get credits for other pastas your own pasta kill. Once a pasta is in the vicinity of a plate, it starts conquering it for its team. It takes around 10 seconds for a plate to be conquered; less if more pasta from the same team are around. If pasta from other team are around, though, they get locked down in their attempt, unable to conquer the plate, until one of them die (think Battlefield's standard 'Conquest' mode). You get points every second for every plate you own. Over time, the concept also evolved to use an Italian bistro as its main scenario. Carlos, Carlos' Bistro's founder and owner Setup No major changes were made from my work setup. I used FDT and Starling creating an Adobe AIR (ActionScript) project, all tools or frameworks I already had some knowledge with. One big change for me was that I livestreamed my work through a twitch.tv account. This was a new thing for me. As recommended by Roushey, I used a program called XSplit and I got to say, it is pretty amazing. It made the livestream pretty effortless and the features are awesome, even for the free version. It was great to have some of my friends watch me, and then interact with them and random people through chat. It was also good knowing that I was also recording a local version of the files, so I could make a timelapse video later. Knowing the video was being recorded also made me a lot more self-conscious about my computer use, as if someone was watching over my shoulder. It made me realize that sometimes I spend too much time in seemingly inane tasks (I ended up wasting the longest time just to get some text alignment the way I wanted - it'll probably drive someone crazy if they watch it) and that I do way too many typos where writing code. I pretty much spend half of the time writing a line and the other half fixing the crazy characters in it. My own stream was probably boring to watch since I was coding for the most time. But livestreaming is one of the cool things to do as a spectator too. It was great seeing other people working - I had a few tabs opened on my second monitor all the time. It's actually a bit sad, because if I could, I could have spent the whole weekend just watching other people working! But I had to do my own work, so I'd only do it once in a while, when resting for a bit. Design Although I wanted some simple, low-fi, high-contrast kind of design, I ended up going with somewhat realistic (vector) art. I think it worked very well, fitting the mood of the game, but I also went overboard. For example: to know the state of a plate (who owns it, who's conquering it and how much time they have left before conquering it, which pasta units are in the queue, etc), you have to look at the plate's bill. The problem I realized when doing some tests is that people never look at the bill! They think it's some kind of prop, so they never actually read its details. Plus, if you're zoomed out too much, you can't actually read it, so it's hard to know what's going on with the game until you zoom in to the area of a specific plate. One other solution that didn't turn out to be as perfect as I thought was how to indicate who a plate base belongs to. In the game, that's indicated by the plate's decoration - its color denotes the team owner. But it's something that fits so well into the design that people never realized it, until they were told about it. In the end, the idea of going with a full physical metaphor is one that should be done with care. Things that are very important risk becoming background noise, unless the player knows its importance. Originally, I wanted to avoid any kind of heads-up display in my game. In the end, I ended up adding it at the bottom to indicate your credits and bases owned, as well as the hideous out-of-place-and-still-not-obvious 'Call Waiter' button. But in hindsight, I should have gone with a simple HUD from the start, especially one that indicated each team's colors and general state of the game without the need for zooming in and out. Development Development went fast. But not fast enough. Even though I worked around 32+ hours for this Ludum Dare, the biggest problem that I had to face in the end was overscoping.", + "gptj-6b": "It is done, and submitted. You can play 'Survival of the Tastiest' on Android, and on the web. Playing on the web works, but you have to simulate multiple touch for table moving and that can be a bit confusing. There is a lot I'd like to talk about. I will go through every topic, insted of making the typical what went right/wrong list. Concept Working over the theme was probably one of the hardest tasks which I had to face. Originally, I had an idea of what kind of game I wanted to develop, gameplay wise - something with a lot of enemies/actors, simple graphics, maybe set in space, controlled from a top-down view. I was confident that I could fit any theme around it. In the end, the problem with a theme like 'Evolution' in a game is that evolution is unassisted. It happens through several seemingly random mutations over time, with the most apt permutation surviving. This genetic car simulator is, in my opinion, a great example of actual evolution of a species facing a challenge. But is it a game? In a game, you need control something to reach an objective. That control goes against what evolution is supposed to be like. If you allow the user to pick how to evolve something, it's not evolution anymore - it's the equivalent of intelligent design, the fable invented by creationists to combat the idea of evolution. Being agnostic and a Pastafarian, that's not something that rubbed me the right way. Hence, my biggest dillema when deciding what to create was not with what I wanted to create, but with what I did not. I didn't want to create an 'intelligent design' simulator and wrongly call it evolution. This is a problem, of course, every other contestant also had to face. And judging by the entries submitted, not many managed to work around it. I'd say the only real solution was through the use of artificial selection, somehow. So far, I haven't seen any entry using this at its core gameplay. Alas, this is just a fun competition and after a while I decided not to be as strict with the game idea, and allowed myself to pick whatever I thought would work out. My initial idea was to create something where humanity tried to evolve to a next level, but had some kind of foe trying to stop them from doing so. I kind of had this image of human souls flying in space towards a monolith or a space baby (all based in 2001: A Space Odyssey of course) but I couldn't think of compelling (read: serious) mechanics for that. Borgs were my next inspiration, as their whole hypothesis fit pretty well into the evolution theme. But how to make it work? Are you the borg, or fighting the Borg? The third and final idea came to me through my girlfriend, who somehow gave me the idea of making something about the evolution of Pasta. The more I thought about it the more it sounded like it would work, so I decided to go with it. Conversations with my inspiring co-worker Roushey (who also created the 'Mechanical Underdogs' signature logo for my intros) further matured the concept, as it involved into the idea of having individual pieces of pasta flying around and trying to evolve until they became all-powerful. A secondary idea here was that the game would work to explain how the Flying Spaghetti Monster came to exist - by evolving from a normal dinner table. So the idea evolved more or less into this: you are sitting a table. You have your own plate, with is your 'base'. There are 5 other guests at the table, each with their own plate. Your plate can spawn little pieces of pasta. You do so by 'ordering' them through a menu. Some pastas are better than others; some are faster, some are stronger. They have varying 'costs', which are debited from your credits (you start with a number of credits). Once spawned, your pastas start flying around. Their instinct is to fly to other plates, in order to conquer them (the objective of the game is having your pasta conquer all the plates on the table). But they are really autonomous, so after being spawned, you have no control over your pasta (think DotA or LoL creeps). Your pasta doesn't like other people's pasta, so if they meet, they shoot sauce at each other until one dies. You get credits for other pastas your own pasta kill. Once a pasta is in the vicinity of a plate, it starts conquering it for its team. It takes around 10 seconds for a plate to be conquered; less if more pasta from the same team are around. If pasta from other team are around, though, they get locked down in their attempt, unable to conquer the plate, until one of them die (think Battlefield's standard 'Conquest' mode). You get points every second for every plate you own. Over time, the concept also evolved to use an Italian bistro as its main scenario. Carlos, Carlos' Bistro's founder and owner Setup No major changes were made from my work setup. I used FDT and Starling creating an Adobe AIR (ActionScript) project, all tools or frameworks I already had some knowledge with. One big change for me was that I livestreamed my work through a twitch.tv account. This was a new thing for me. As recommended by Roushey, I used a program called XSplit and I got to say, it is pretty amazing. It made the livestream pretty effortless and the features are awesome, even for the free version. It was great to have some of my friends watch me, and then interact with them and random people through chat. It was also good knowing that I was also recording a local version of the files, so I could make a timelapse video later. Knowing the video was being recorded also made me a lot more self-conscious about my computer use, as if someone was watching over my shoulder. It made me realize that sometimes I spend too much time in seemingly inane tasks (I ended up wasting the longest time just to get some text alignment the way I wanted - it'll probably drive someone crazy if they watch it) and that I do way too many typos where writing code. I pretty much spend half of the time writing a line and the other half fixing the crazy characters in it. My own stream was probably boring to watch since I was coding for the most time. But livestreaming is one of the cool things to do as a spectator too. It was great seeing other people working - I had a few tabs opened on my second monitor all the time. It's actually a bit sad, because if I could, I could have spent the whole weekend just watching other people working! But I had to do my own work, so I'd only do it once in a while, when resting for a bit. Design Although I wanted some simple, low-fi, high-contrast kind of design, I ended up going with somewhat realistic (vector) art. I think it worked very well, fitting the mood of the game, but I also went overboard. For example: to know the state of a plate (who owns it, who's conquering it and how much time they have left before conquering it, which pasta units are in the queue, etc), you have to look at the plate's bill. The problem I realized when doing some tests is that people never look at the bill! They think it's some kind of prop, so they never actually read its details. Plus, if you're zoomed out too much, you can't actually read it, so it's hard to know what's going on with the game until you zoom in to the area of a specific plate. One other solution that didn't turn out to be as perfect as I thought was how to indicate who a plate base belongs to. In the game, that's indicated by the plate's decoration - its color denotes the team owner. But it's something that fits so well into the design that people never realized it, until they were told about it. In the end, the idea of going with a full physical metaphor is one that should be done with care. Things that are very important risk becoming background noise, unless the player knows its importance. Originally, I wanted to avoid any kind of heads-up display in my game. In the end, I ended up adding it at the bottom to indicate your credits and bases owned, as well as the hideous out-of-place-and-still-not-obvious 'Call Waiter' button. But in hindsight, I should have gone with a simple HUD from the start, especially one that indicated each team's colors and general state of the game without the need for zooming in and out. Development Development went fast. But not fast enough. Even though I worked around 32+ hours for this Ludum Dare, the biggest problem I had to face in the end was overscoping. I had too much planned, and could not get it all done. Content-wise, I had several kinds of pasta planned - Wikipedia is just amazing in that regard, split into several different groups, from small Pastina to huge Pasta al forno. But because of time constraints, I ended up scratching most of them, and ended up with 5 different types of small pasta - barely something to start when talking about the evolution of Pasta. Pastas used in the game. Unfortunately, the macs where never used Which is one of the saddest things about the project, really. It had the framework and the features to allow an endless number of elements in there, but I just did not have time to draw the rest of the assets needed (something I loved to do).", + "chinese1": "\"它完成了,并提交了。你可以在Android和网络上玩“美味生存”。在网络上玩是有效的,但你必须模拟多次触摸才能移动桌子,这可能会有点令人困惑。我想谈的有很多。我将浏览每个主题,而不是列出典型的正确/错误列表。概念 围绕这个主题工作可能是我必须面对的最艰巨的任务之一。最初,我有一个想法,我想开发什么样的游戏,游戏玩法明智有很多敌人/演员的东西,简单的图形,可能设置在太空中,从自上而下的视图控制。我相信我可以围绕它适合任何主题。最后,游戏中像“进化”这样的主题的问题在于进化是无辅助的。随着时间的推移,它通过几个看似随机的突变发生,最合适的排列幸存下来。在我看来,这个基因汽车模拟器是面临挑战的物种实际进化的一个很好的例子。但这是游戏吗?在游戏中,您需要控制某些东西才能达到目标。这种控制违背了进化应该是什么样子。如果你允许用户选择如何进化某些东西,它就不再是进化了——它相当于智能设计,是创造论者发明的寓言,用来对抗进化论的想法。作为不可知论者和意大利面主义者,这不是以正确的方式摩擦我的东西。因此,在决定创作什么时,我最大的困惑不是我想创造什么,而是我不想要创造什么。我不想创建一个“智能设计”模拟器,并错误地称之为进化。这是一个问题,当然,其他参赛者也都要面对。从提交的条目来看,没有多少人设法解决这个问题。我想说,唯一真正的解决方案是通过使用人工选择,不知何故。到目前为止,我还没有看到任何条目在其核心游戏玩法中使用它。唉,这只是一个有趣的比赛,过了一段时间,我决定不那么严格地要求游戏理念,并允许自己选择我认为可行的任何内容。我最初的想法是创造一些东西,让人类试图进化到一个新的水平,但有某种敌人试图阻止他们这样做。我有点像人类灵魂在太空中飞向巨石或太空婴儿的图像(当然都是基于2001:太空漫游),但我想不出令人信服的(阅读:严肃的)机制。博格人是我的下一个灵感来源,因为他们的整个假设非常符合进化论的主题。但是如何让它工作呢?你是博格人,还是与博格人战斗?你是博格人,还是与博格人战斗?它完成了,并提交了。你可以在Android和网络上玩“美味生存”。在网络上玩是有效的,但你必须模拟多次触摸才能移动桌子,这可能会有点令人困惑。我想谈的有很多。我将浏览每个主题,而不是列出典型的正确/错误列表。概念围绕这个主题工作可能是我必须面对的最艰巨的任务之一。最初,我有一个想法,我想开发什么样的游戏,游戏玩法明智有很多敌人/演员的东西,简单的图形,可能设置在太空中,从自上而下的视图控制。我相信我可以围绕它适合任何主题。最后,游戏中像“进化”这样的主题的问题在于进化是无辅助的。随着时间的推移,它通过几个看似随机的突变发生,最合适的排列幸存下来。在我看来,这个基因汽车模拟器是面临挑战的物种实际进化的一个很好的例子。但这是游戏吗?在游戏中,您需要控制某些东西才能达到目标。这种控制违背了进化应该是什么样子。如果你允许用户选择如何进化某些东西,它就不再是进化了——它相当于智能设计,是创造论者发明的寓言,用来对抗进化论的想法。作为不可知论者和意大利面主义者,这不是以正确的方式摩擦我的东西。因此,在决定创作什么时,我最大的困惑不是我想创造什么,而是我不想要创造什么。我不想创建一个“智能设计”模拟器,并错误地称之为进化。这是一个问题,当然,其他参赛者也都要面对。从提交的条目来看,没有多少人设法解决这个问题。我想说,唯一真正的解决方案是通过使用人工选择,不知何故。到目前为止,我还没有看到任何条目在其核心游戏玩法中使用它。唉,这只是一个有趣的比赛,过了一段时间,我决定不那么严格地要求游戏理念,并允许自己选择我认为可行的任何内容。我最初的想法是创造一些东西,让人类试图进化到一个新的水平,但有某种敌人试图阻止他们这样做。我有点像人类灵魂在太空中飞向巨石或太空婴儿的图像(当然都是基于2001:太空漫游),但我想不出令人信服的(阅读:严肃的)机制。博格人是我的下一个灵感来源,因为他们的整个假设非常符合进化论的主题。但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?工作呢?它完成了,并提交了。你可以在Android和网络上玩“美味生存”。在网络上玩是有效的,但你必须模拟多次触摸才能移动桌子,这可能会有点令人困惑。我想谈的有很多。我将浏览每个主题,而不是列出典型的正确/错误列表。概念围绕这个主题工作可能是我必须面对的最艰巨的任务之一。最初,我有一个想法,我想开发什么样的游戏,游戏玩法明智有很多敌人/演员的东西,简单的图形,可能设置在太空中,从自上而下的视图控制。我相信我可以围绕它适合任何主题。最后,游戏中像“进化”这样的主题的问题在于进化是无辅助的。随着时间的推移,它通过几个看似随机的突变发生,最合适的排列幸存下来。在我看来,这个基因汽车模拟器是面临挑战的物种实际进化的一个很好的例子。但这是游戏吗?在游戏中,您需要控制某些东西才能达到目标。这种控制违背了进化应该是什么样子。如果你允许用户选择如何进化某些东西,它就不再是进化了——它相当于智能设计,是创造论者发明的寓言,用来对抗进化论的想法。作为不可知论者和意大利面主义者,这不是以正确的方式摩擦我的东西。因此,在决定创作什么时,我最大的困惑不是我想创造什么,而是我不想要创造什么。我不想创建一个“智能设计”模拟器,并错误地称之为进化。这是一个问题,当然,其他参赛者也都要面对。从提交的条目来看,没有多少人设法解决这个问题。我想说,唯一真正的解决方案是通过使用人工选择,不知何故。到目前为止,我还没有看到任何条目在其核心游戏玩法中使用它。唉,这只是一个有趣的比赛,过了一段时间,我决定不那么严格地要求游戏理念,并允许自己选择我认为可行的任何内容。我最初的想法是创造一些东西,让人类试图进化到一个新的水平,但有某种敌人试图阻止他们这样做。我有点像人类灵魂在太空中飞向巨石或太空婴儿的图像(当然都是基于2001:太空漫游),但我想不出令人信服的(阅读:严肃的)机制。博格人是我的下一个灵感来源,因为他们的整个假设非常符合进化论的主题。但是如何让它工作呢?你是博格人,还是与博格人战斗?你是博格人,还是与博格人战斗?它完成了,并提交了。你可以在Android和网络上玩“美味生存”。在网络上玩是有效的,但你必须模拟多次触摸才能移动桌子,这可能会有点令人困惑。我想谈的有很多。我将浏览每个主题,而不是列出典型的正确/错误列表。概念围绕这个主题工作可能是我必须面对的最艰巨的任务之一。最初,我有一个想法,我想开发什么样的游戏,游戏玩法明智有很多敌人/演员的东西,简单的图形,可能设置在太空中,从自上而下的视图控制。我相信我可以围绕它适合任何主题。最后,游戏中像“进化”这样的主题的问题在于进化是无辅助的。随着时间的推移,它通过几个看似随机的突变发生,最合适的排列幸存下来。在我看来,这个基因汽车模拟器是面临挑战的物种实际进化的一个很好的例子。但这是游戏吗?在游戏中,您需要控制某些东西才能达到目标。这种控制违背了进化应该是什么样子。如果你允许用户选择如何进化某些东西,它就不再是进化了——它相当于智能设计,是创造论者发明的寓言,用来对抗进化论的想法。作为不可知论者和意大利面主义者,这不是以正确的方式摩擦我的东西。因此,在决定创作什么时,我最大的困惑不是我想创造什么,而是我不想要创造什么。我不想创建一个“智能设计”模拟器,并错误地称之为进化。这是一个问题,当然,其他参赛者也都要面对。从提交的条目来看,没有多少人设法解决这个问题。我想说,唯一真正的解决方案是通过使用人工选择,不知何故。到目前为止,我还没有看到任何条目在其核心游戏玩法中使用它。唉,这只是一个有趣的比赛,过了一段时间,我决定不那么严格地要求游戏理念,并允许自己选择我认为可行的任何内容。我最初的想法是创造一些东西,让人类试图进化到一个新的水平,但有某种敌人试图阻止他们这样做。我有点像人类灵魂在太空中飞向巨石或太空婴儿的图像(当然都是基于2001:太空漫游),但我想不出令人信服的(阅读:严肃的)机制。博格人是我的下一个灵感来源,因为他们的整个假设非常符合进化论的主题。但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢但是工作?\"", + "chinese2": "\"它完成了,并提交了。你可以在Android和网络上玩“美味生存”。在网络上玩是有效的,但你必须模拟多次触摸才能移动桌子,这可能会有点令人困惑。我想谈的有很多。我将浏览每个主题,而不是列出典型的正确/错误列表。概念 围绕这个主题工作可能是我必须面对的最艰巨的任务之一。最初,我有一个想法,我想开发什么样的游戏,游戏玩法明智有很多敌人/演员的东西,简单的图形,可能设置在太空中,从自上而下的视图控制。我相信我可以围绕它适合任何主题。最后,游戏中像“进化”这样的主题的问题在于进化是无辅助的。随着时间的推移,它通过几个看似随机的突变发生,最合适的排列幸存下来。在我看来,这个基因汽车模拟器是面临挑战的物种实际进化的一个很好的例子。但这是游戏吗?在游戏中,您需要控制某些东西才能达到目标。这种控制违背了进化应该是什么样子。如果你允许用户选择如何进化某些东西,它就不再是进化了——它相当于智能设计,是创造论者发明的寓言,用来对抗进化论的想法。作为不可知论者和意大利面主义者,这不是以正确的方式摩擦我的东西。因此,在决定创作什么时,我最大的困惑不是我想创造什么,而是我不想要创造什么。我不想创建一个“智能设计”模拟器,并错误地称之为进化。这是一个问题,当然,其他参赛者也都要面对。从提交的条目来看,没有多少人设法解决这个问题。我想说,唯一真正的解决方案是通过使用人工选择,不知何故。到目前为止,我还没有看到任何条目在其核心游戏玩法中使用它。唉,这只是一个有趣的比赛,过了一段时间,我决定不那么严格地要求游戏理念,并允许自己选择我认为可行的任何内容。我最初的想法是创造一些东西,让人类试图进化到一个新的水平,但有某种敌人试图阻止他们这样做。我有点像人类灵魂在太空中飞向巨石或太空婴儿的图像(当然都是基于2001:太空漫游),但我想不出令人信服的(阅读:严肃的)机制。博格人是我的下一个灵感来源,因为他们的整个假设非常符合进化论的主题。但是如何让它工作呢?你是博格人,还是与博格人战斗?你是博格人,还是与博格人战斗?它完成了,并提交了。你可以在Android和网络上玩“美味生存”。在网络上玩是有效的,但你必须模拟多次触摸才能移动桌子,这可能会有点令人困惑。我想谈的有很多。我将浏览每个主题,而不是列出典型的正确/错误列表。概念围绕这个主题工作可能是我必须面对的最艰巨的任务之一。最初,我有一个想法,我想开发什么样的游戏,游戏玩法明智有很多敌人/演员的东西,简单的图形,可能设置在太空中,从自上而下的视图控制。我相信我可以围绕它适合任何主题。最后,游戏中像“进化”这样的主题的问题在于进化是无辅助的。随着时间的推移,它通过几个看似随机的突变发生,最合适的排列幸存下来。在我看来,这个基因汽车模拟器是面临挑战的物种实际进化的一个很好的例子。但这是游戏吗?在游戏中,您需要控制某些东西才能达到目标。这种控制违背了进化应该是什么样子。如果你允许用户选择如何进化某些东西,它就不再是进化了——它相当于智能设计,是创造论者发明的寓言,用来对抗进化论的想法。作为不可知论者和意大利面主义者,这不是以正确的方式摩擦我的东西。因此,在决定创作什么时,我最大的困惑不是我想创造什么,而是我不想要创造什么。我不想创建一个“智能设计”模拟器,并错误地称之为进化。这是一个问题,当然,其他参赛者也都要面对。从提交的条目来看,没有多少人设法解决这个问题。我想说,唯一真正的解决方案是通过使用人工选择,不知何故。到目前为止,我还没有看到任何条目在其核心游戏玩法中使用它。唉,这只是一个有趣的比赛,过了一段时间,我决定不那么严格地要求游戏理念,并允许自己选择我认为可行的任何内容。我最初的想法是创造一些东西,让人类试图进化到一个新的水平,但有某种敌人试图阻止他们这样做。我有点像人类灵魂在太空中飞向巨石或太空婴儿的图像(当然都是基于2001:太空漫游),但我想不出令人信服的(阅读:严肃的)机制。博格人是我的下一个灵感来源,因为他们的整个假设非常符合进化论的主题。但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?工作呢?它完成了,并提交了。你可以在Android和网络上玩“美味生存”。在网络上玩是有效的,但你必须模拟多次触摸才能移动桌子,这可能会有点令人困惑。我想谈的有很多。我将浏览每个主题,而不是列出典型的正确/错误列表。概念围绕这个主题工作可能是我必须面对的最艰巨的任务之一。最初,我有一个想法,我想开发什么样的游戏,游戏玩法明智有很多敌人/演员的东西,简单的图形,可能设置在太空中,从自上而下的视图控制。我相信我可以围绕它适合任何主题。最后,游戏中像“进化”这样的主题的问题在于进化是无辅助的。随着时间的推移,它通过几个看似随机的突变发生,最合适的排列幸存下来。在我看来,这个基因汽车模拟器是面临挑战的物种实际进化的一个很好的例子。但这是游戏吗?在游戏中,您需要控制某些东西才能达到目标。这种控制违背了进化应该是什么样子。如果你允许用户选择如何进化某些东西,它就不再是进化了——它相当于智能设计,是创造论者发明的寓言,用来对抗进化论的想法。作为不可知论者和意大利面主义者,这不是以正确的方式摩擦我的东西。因此,在决定创作什么时,我最大的困惑不是我想创造什么,而是我不想要创造什么。我不想创建一个“智能设计”模拟器,并错误地称之为进化。这是一个问题,当然,其他参赛者也都要面对。从提交的条目来看,没有多少人设法解决这个问题。我想说,唯一真正的解决方案是通过使用人工选择,不知何故。到目前为止,我还没有看到任何条目在其核心游戏玩法中使用它。唉,这只是一个有趣的比赛,过了一段时间,我决定不那么严格地要求游戏理念,并允许自己选择我认为可行的任何内容。我最初的想法是创造一些东西,让人类试图进化到一个新的水平,但有某种敌人试图阻止他们这样做。我有点像人类灵魂在太空中飞向巨石或太空婴儿的图像(当然都是基于2001:太空漫游),但我想不出令人信服的(阅读:严肃的)机制。博格人是我的下一个灵感来源,因为他们的整个假设非常符合进化论的主题。但是如何让它工作呢?你是博格人,还是与博格人战斗?你是博格人,还是与博格人战斗?它完成了,并提交了。你可以在Android和网络上玩“美味生存”。在网络上玩是有效的,但你必须模拟多次触摸才能移动桌子,这可能会有点令人困惑。我想谈的有很多。我将浏览每个主题,而不是列出典型的正确/错误列表。概念围绕这个主题工作可能是我必须面对的最艰巨的任务之一。最初,我有一个想法,我想开发什么样的游戏,游戏玩法明智有很多敌人/演员的东西,简单的图形,可能设置在太空中,从自上而下的视图控制。我相信我可以围绕它适合任何主题。最后,游戏中像“进化”这样的主题的问题在于进化是无辅助的。随着时间的推移,它通过几个看似随机的突变发生,最合适的排列幸存下来。在我看来,这个基因汽车模拟器是面临挑战的物种实际进化的一个很好的例子。但这是游戏吗?在游戏中,您需要控制某些东西才能达到目标。这种控制违背了进化应该是什么样子。如果你允许用户选择如何进化某些东西,它就不再是进化了——它相当于智能设计,是创造论者发明的寓言,用来对抗进化论的想法。作为不可知论者和意大利面主义者,这不是以正确的方式摩擦我的东西。因此,在决定创作什么时,我最大的困惑不是我想创造什么,而是我不想要创造什么。我不想创建一个“智能设计”模拟器,并错误地称之为进化。这是一个问题,当然,其他参赛者也都要面对。从提交的条目来看,没有多少人设法解决这个问题。我想说,唯一真正的解决方案是通过使用人工选择,不知何故。到目前为止,我还没有看到任何条目在其核心游戏玩法中使用它。唉,这只是一个有趣的比赛,过了一段时间,我决定不那么严格地要求游戏理念,并允许自己选择我认为可行的任何内容。我最初的想法是创造一些东西,让人类试图进化到一个新的水平,但有某种敌人试图阻止他们这样做。我有点像人类灵魂在太空中飞向巨石或太空婴儿的图像(当然都是基于2001:太空漫游),但我想不出令人信服的(阅读:严肃的)机制。博格人是我的下一个灵感来源,因为他们的整个假设非常符合进化论的主题。但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢但是工作?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢但是工作?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢但是工作?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢但是工作?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢但是工作?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢但是工作?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是如何让它工作呢?但是?\"" + } + } +}