<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def run(self, bucket_name, filename, path):
 """ Initiate the upload. :param bucket_name: Name of the S3 bucket :type bucket_name: String :param filename: The filname :type filename: String :param path: The path to the file that needs to be uploaded :type path: String :returns: void """


        f = open(path, 'rb')
        self.source_size = os.stat(path).st_size
        total_dict = {}

        def cb(part_no, uploaded, total):

            total_dict[part_no] = uploaded

            params = {
                'uploaded': round(sum(total_dict.values()) / 1048576, 0),
                'size': round(self.source_size / 1048576, 0),
            }

            p = (self.progress_template + '\r') % params

            STREAM.write(p)
            STREAM.flush()

        self.output('Uploading to S3', normal=True, arrow=True)
        upload(bucket_name, self.key, self.secret,
               data_collector(iter(f)), filename, cb,
               threads=10, replace=True, secure=True, connection=self.conn)

        print('\n')
        self.output('Upload Completed', normal=True, arrow=True)